본문 바로가기
Spring

요청 DTO의 기본 설정과 이유

by ghan2 2024. 4. 28.

DTO로 정보를 받아올 때마다 헷갈리는 것은 각 클래스에 어떤 어노테이션을 달아줄지이다. 

이제는 확실히 이해하고 기억하자!

 

@RequestBody

@RequestBody를 지정한 객체의 경우 컨트롤러에 온 요청을 해당 객체에 매핑시켜 변환하는 역할을 해준다.

컨트롤러에 @RequestBody로 지정한 객체는 본문 형식을 확인한 후 자바객체로 변환하게 된다.

Jackson은 JSON 데이터를 출력하기 위한 MappingHttpMessageConverter를 제공한다. 만약 Spring MessageConverter에 MappingJacksonHttpMessageConverterfmf 등록하면, Controller가 리턴하는 객체를 다시 Jackson의 objectMapper API로 JSON 객체를 만들고 나서 JSON 데이터를 출력한다. (spring3.0부터 제공)

 

ObjectMapper는 Java Object ↔ JSON 파싱을 해주는 클래스다.

 

자바 객체에서 JSON 형태로 변환하는 것을 직렬화(Serialize)라고 하며, JSON을 자바 객체로 변환하는 것을 역직렬화라고 한다. 

스프링은 자체적으로 Jackson을 의존성으로 등록해두고 있기 때문에 스프링에서 제공하는 맨 아래의 AbstractJackson2HttpMessageConverter에서 Jackson의 ObjectMapper, BeanDeserializer, 최종적으로 Java Reflection의 Constructor까지 호출하면서 SampleObject의 생성자를 호출하는 것을 볼 수 있다.

 

이때 delegatingSerializer를 통해서 반환하는데. 만약, deletgate를 하지 않았거나 Property로 명시해주지 않았다면 기본적으로 기본생성자를 통해 변환하게 된다. 따라서 @NoArgsConstructor가 필요하다.

 

ObjectMapper는 Setter와 Getter로 DTO의 필드를 가져온다.

그리고 setter를 사용하는 것이 아니라 reflection을 사용해서 필드 값들을 넣어준다.

 

결론

따라서 DTO에 사용할 필요가 거의 없는 Setter보다 프로덕션 코드에 사용되거나 테스트에서 필요한 @Getter와 @NoArgsConstructor를 명시해주면 되겠다.

 

 

참고문서
https://url.kr/xiqlkp
https://url.kr/5d947m

 

'Spring' 카테고리의 다른 글

[Spring] Spring Security 동작 원리  (1) 2024.07.01
[Spring] POJO, Java Bean, Spring Bean  (0) 2024.06.01
Thymeleaf - layout 구조 나누기  (0) 2024.05.01
AWS RDS(mySql) 프리티어 생성하기  (0) 2024.04.22
[dbcp2] connection pool 설정  (0) 2024.04.18