스프링에서 컨트롤러를 만들고 관리 하다 보면, 데이터를 전송하거나, 받는 경우 이러한 어노테이션을 발견 할 수 있다.
- @RequestBody
- @ResponseBody
나도 처음 스프링을 공부하고 뷰에 데이터를 전달 받거나, 전달 할 때 아무 이유도 없이 그냥 그렇게 쓰라니까 썼던 것 같다. 이번 포스팅은 이 두가지에 대해 좀 정리하는 느낌으로 해야겠다.
Http 구조?
서버와 클라이언트의 통신을 위해 보통은 Http 통신을 이용하는 것 같다. 자세한 구조와 동작 방식은 여기서는 다루지 않는 것이 좋을 것 같다.
간단히 Http에 대해서 위키백과에서의 정의를 인용하자면,
HTTP(HyperText Transfer Protocol)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다. 1996년 버전 1.0, 그리고 1999년 1.1이 각각 발표되었다.
...
HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다.
정말 신기한 점이 있는데 현재도 쓰이고 있는 HTTP 버전은 무려 1.1이다. 그러니까 이 글을 작성하는 시점인 2020년으로부터 대략 20년이 좀 넘은 프로토콜이라는 것이다. 얼마나 견고하게 만들었길래 아직도 버전 업데이트를 안하는 것일까. -> 계속 알아본 결과 HTTP 버전은 2까지 나와있는 상태이다.
Http의 구성 요소로는 Http Header 와 Http Body로 나뉘어 진다.
Http Header는 요청, 응답과 같은 정보를 포함하고, Http Body는 실제 컨텐츠를 담는 역할을 한다.
그렇다면 @RequestBody와 @ResponseBody는 무슨 역할을 하는 걸까?
@RequestBody
@RequestBody 어노테이션은 앞서 말했던 Http를 일종의 자바 객체로 넘겨 받아 사용할 수 있게 해 준다.
즉 Http의 요청을 그대로 받아 자바 객체로 받을 수 있게 해 주는 것이다.
다른 블로그나, 정보 사이트에서 의하면 이 것이 하는 일은 내부적으로 RequestMappingHandlerAdapter의 HttpMessageConverter 타입의 변환기가 Http 요청에 따른 컨텐츠 타입을 구분하고 변환 가능할 경우에 본문 부분을 전달해 준다.
...글만 봐서는 잘 모르겠지만, http 응답 타입을 구분하고, 처리 가능할 경우, 변환시켜 자바 객체로 반환시켜주는 느낌이다.
즉, 클라이언트에서 응답한 Http 응답을 받아 변환 후, 자바 객체로 변환시켜 쓸 수 있도록 만들어주는 것이다.
@ResponseBody
반대로 생각해보자, @RequestBody가 Http 응답을 자바 객체로 변환해준다면, 반대로 @ResponseBody는 자바 객체를 Http 몸체로 변환해 클라이언트와 통신할 때 쓰이는 것이다.
1
2
3
4
5
6
7
8
9
10
|
@Controller
public class Controller { @RequestMapping(value="/test")
@ResponseBody
public DTO goDTO() {
int data = 0;
return new DTO(data);
}
}
|
cs |
이렇게 @ResponseBody를 쓰게 된다면, 뷰를 통해서 보여주는 방식이 아닌, Http 응답 몸체로 변환시켜 전송시켜 주게 되는 것이다.
'Spring & Boot' 카테고리의 다른 글
[Spring] REST API (0) | 2020.09.22 |
---|---|
[Spring] MVC 패턴 - Model1, Model2 (0) | 2020.09.02 |
[Spring] D.I (Dependency Injection) 의존성 주입, 도대체 뭘까? (0) | 2020.09.02 |
[Spring] Spring Framework, 왜 쓸까? (0) | 2020.09.01 |