- 개인 공부 목적으로 작성한 글입니다.
- 아래 출처를 참고하여 작성하였습니다.
목차
- Intro
- HttpMessageConverter
- JSON을 사용한 Client 요청을 Spring이 처리하는 과정
- @RequestBody, @ResponseBody 동작방식
1. Intro
- Spring Framework에서 많이 사용하는 @RequestBody, @ResponseBody 동작 방식에 대해 살펴봅니다.
- 결론부터 말하면 @RequestBody, @ResponseBody 어노테이션이 붙은 객체는 get이나 set 키워드가 붙은 메서드에 대해서만 값이 바인딩됩니다.
- 그래서 getter 또는 setter를 열어둬야 합니다.
- 객체 내의 필드(변수) 값을 기반으로 데이터가 매핑되는 것이 아닌 get키워드나 set키워드가 붙은 function을 기준으로 값이 바인딩됩니다.
2. HttpMessageConverter
- Spring에서는 HTTP 통신으로 들어온 JSON, XML 요청을 Java Object화하는데 HttpMessageConverter를 사용합니다.
3. JSON을 사용한 Client 요청을 Spring이 처리하는 과정
- Spring은 요청을 받으면, 요청 타입이 뭔지 알기 위해 'Content-Type' 헤더를 사용하여 요청 본문의 미디어 타입을 확인합니다.
- 그런 다음 클라이언트가 보낸 본문을 Java Object로 변환할 수 있는 HttpMessageConverter를 검색합니다.
- 스프링 3.1 이후부터는 class path에 Jackson 라이브러리가 있으면 MappingJacksonHttpMessageConverter가 자동 등록 됩니다.
- 즉, Spring은 별다른 설정이 없으면 기본적으로 Jackson message converter를 사용합니다.
4. @RequestBody, @ResponseBody 동작방식
- MessageConverter 중 MappingJacksonHttpMessageConverter를 사용하여 리플렉션을 통해 @RequestBody, @ResponseBody가 붙은 객체를 가져와 Jackson의 ObjectMapper를 써서 직렬화, 역직렬화를 합니다.
- 리플렉션을 사용하기 때문에 생성자나 필드 기반이 아니고, get이나 set 키워드로 시작하는 메서드를 '필드'로 인식하고 거기에 데이터를 바인딩합니다.
- 즉, DTO 객체 내부에 test라는 필드명이 없어도 int getTest() 라는 메서드를 추가하면 json으로 결과를 내려줄 때 'test'라는 key값이 추가되어 결과가 나오는 것을 확인할 수 있습니다.
출처
'SpringBoot > Controller Layer' 카테고리의 다른 글
Form 데이터 요청을 DTO에 바인딩하는 방법 (0) | 2021.10.03 |
---|