본문 바로가기
SpringBoot/Controller Layer

@RequestBody, @ResponseBody (feat. Jackson 라이브러리 동작방식)

by BAYABA 2021. 10. 2.
  1. 개인 공부 목적으로 작성한 글입니다.
  2. 아래 출처를 참고하여 작성하였습니다.

목차

  1. Intro
  2. HttpMessageConverter
  3. JSON을 사용한 Client 요청을 Spring이 처리하는 과정
  4. @RequestBody, @ResponseBody 동작방식

1. Intro

  1. Spring Framework에서 많이 사용하는 @RequestBody, @ResponseBody 동작 방식에 대해 살펴봅니다.
  2. 결론부터 말하면 @RequestBody, @ResponseBody 어노테이션이 붙은 객체는 get이나 set 키워드가 붙은 메서드에 대해서만 값이 바인딩됩니다.
  • 그래서 getter 또는 setter를 열어둬야 합니다.
  • 객체 내의 필드(변수) 값을 기반으로 데이터가 매핑되는 것이 아닌 get키워드나 set키워드가 붙은 function을 기준으로 값이 바인딩됩니다.

2. HttpMessageConverter

  1. Spring에서는 HTTP 통신으로 들어온 JSON, XML 요청을 Java Object화하는데 HttpMessageConverter를 사용합니다.

3. JSON을 사용한 Client 요청을 Spring이 처리하는 과정

  1. Spring은 요청을 받으면, 요청 타입이 뭔지 알기 위해 'Content-Type' 헤더를 사용하여 요청 본문의 미디어 타입을 확인합니다.
  2. 그런 다음 클라이언트가 보낸 본문을 Java Object로 변환할 수 있는 HttpMessageConverter를 검색합니다.
  • 스프링 3.1 이후부터는 class path에 Jackson 라이브러리가 있으면 MappingJacksonHttpMessageConverter가 자동 등록 됩니다.
  • 즉, Spring은 별다른 설정이 없으면 기본적으로 Jackson message converter를 사용합니다.

4. @RequestBody, @ResponseBody 동작방식

  1. MessageConverter 중 MappingJacksonHttpMessageConverter를 사용하여 리플렉션을 통해 @RequestBody, @ResponseBody가 붙은 객체를 가져와 Jackson의 ObjectMapper를 써서 직렬화, 역직렬화를 합니다.
  • 리플렉션을 사용하기 때문에 생성자나 필드 기반이 아니고, get이나 set 키워드로 시작하는 메서드를 '필드'로 인식하고 거기에 데이터를 바인딩합니다.
  • 즉, DTO 객체 내부에 test라는 필드명이 없어도 int getTest() 라는 메서드를 추가하면 json으로 결과를 내려줄 때 'test'라는 key값이 추가되어 결과가 나오는 것을 확인할 수 있습니다.

출처

  1. [Spring] Jackson이란?
  2. Http Message Converters with the Spring Framework
  3. [Spring] Jackson 라이브러리 이해하기.