IT 정보/스프링 부트

@RequestBody란?

nagrang 2025. 12. 30. 17:12

핵심

@RequestBody는 HTTP 요청 본문에 담긴 데이터를 자바의 객체로 변환(역직렬화)해주는 역할을 한다.

이때 안쪽 로직에서는 HttpMessageConverter 인터페이스와 Jackson 라이브러리가 사용된다.

 

 

작동 원리

스프링 부트가 요청을 받아서 컨트롤러까지 도달하는 과정을 알아보자.

 

step1. 문지기 (DispatcherServlet)

HTTP 요청이 들어오면 스프링의 제일 앞단에 있는 DispatcherServlet 이 요청을 받는다.

 

 

step2. 해결사 (HandlerAdapter & ArgumentResolver)

스프링은 컨트롤러 메서드를 실행하기 전에, 파라미터 앞에 @RequestBody가 붙어있는 것을 확인한다. 바로 전달을 하면 안되고, 객체로 만들어서 줘야 함을 알아차린다.

이때부터 RequestReponseBodyMethodProcessor 가 처리한다.

 

 

step3. 기술자 선정 (HttpMessageConverter)

스프링은 요청 헤더의 content-Type을 확인한다.

만약 Conent-Type : application/json 이면 json 전용 converter를 호출한다 (MappingJackson2HttpMessageConverter)

 

 

step4: 조립(ObjectMapper)

선택된 컨버터는 내부적으로 Jackson 라이브러리의 ObjectMapper 를 사용한다. json을 객체로 역직렬화 시작

1. 생성 : @ReqeustBody 어노테이션 오른쪽 클래스(DTO)의 기본 생성자를 호출해서 빈 껍데기 객체를 만든다.

2. 매핑 : json의 key이름과 DTO의 필드명을 비교한다.

3. 주입 : 이름이 같으면 데이터를 넣는다. 이때 Reflection 이나 Setter를 사용한다.

 

하지만 Setter는 외부에서 언제나 값을 바꿀수 있기 때문에 사용을 지양하는 편이다. 그럼 어떻게 넣으냐하면

@JsonProeprty 같은 어노테이션을 사용하거나, Jackson 설정을 통해 Reflection으로 private 필드에 강제로 접근하여 메모리에 바로 값을 넣을 수 있다.

 

 

정리

  • @RequestBody는 내부적으로 Jackson(json일 때)라이브러리를 사용한다.
  • Jackson은 역직렬화를 위해 ObjectMapper를 사용하는데 이때 기본 생성자로 빈 껍데기를 만들고, 필드 이름을 매칭 시켜 setter 방식으로 객체를 만든다. 그러므로 DTO는 기본 생성자와 setter가 필수이다.
  • 하지만 setter를 선언하지 않고 getter만 있을 떄 내부적으로 Reflection을 사용하여 값을 주입해준다.
  • Reflection 기술을 통해 접근 지정자를 무시하고 강제로 메모리에 값을 넣는다.