본문 바로가기
Spring & SpringBoot

Spring에서 DTO에 필요한 lombok annotation 총 정리

by 창따오 2024. 2. 27.
728x90

컨트롤러에서 DTO를 주고받기 때문에 JSON 직렬화와 역직렬화가 일어난다.

- 직렬화(serialization) : Java Object가 JSON으로 변환되는 것으로, ResponseBody를 사용할 때 일어난다. (Server -> Client)-역직렬화(deserialization): JSON이 Java 오브젝트롤 변환되는 것으로, RequestBody를 사용할 때, 일어난다.(Client -> Server)

 

DTO 직렬화/역직렬화 시에 필드에 어떻게 접근할 것인가?

SpringBoot에서 DTO를 직렬화/역직렬화하기 위해서는 Jackson이 동작하는데, Jackson 내부에서는 ObjectMapper가 

Java Reflection을 사용한다. 이 때, 이부분에서는 기본생성자와 @Getter/ @Setter가 필요하다.

 

정리해보자면 아래와 같다.

-직렬화(Java Object -> JSON)  : @Getter 필요함. (@Setter 불가능), 기본 생성자 필요없음

-역직렬화(JSON -> Java Object) : @Getter나 @Setter중에 하나만 있어도된다. 기본생성자 필요

 

여기서 잠깐? 역직렬화 할 때, 기본생성자는 왜 필요할까?

ObjectMapper의 동작 방식을 보면 역직렬화 시에 기본 생성자를 이용하여 객체를 생성한 후에 @Getter나 @Setter를 이용하여 필드를 가져온다. 이 때 필드를 가져오기 위해서는 위에서 말했던 reflection을 이용한다.그렇기에 @Setter가 필요하지 않는 이상 @Setter보다는 @Getter를 선언하는 것이 좋다.(setter는 필드 값이 바뀔 가능성을 높여주기 때문에)

 

♣정리

DTO에는 @Builder도 많이 사용하기 때문에 빌더를 사용할 경우에는 @Builder, @Getter, @NoArgsConstructor (private으로) @AllArgsConstructor를 무조건 명시해주는 것이 현명!

 

@ Builder를 사용하지 않을 경우에는 직렬화 @Getter, 역직렬화 dto에는 @Getter와 @NoArgsConstructor(private)으로 기본 생성자를 무조건 명시해주는 것이 현명!

'Spring & SpringBoot' 카테고리의 다른 글

JAR 와 WAR의 차이  (0) 2024.03.08
Spring Bean과 생명주기  (0) 2024.03.07
Web Server와 WAS의 차이  (0) 2024.02.26
Rest API, REST 의미  (0) 2024.01.10
스프링의 트랜잭션 추상화와 동기화  (0) 2023.12.28