Weekly TIL

Weekly TIL - Day 38

KoesJin 2025. 5. 22. 12:24

⭐️ Today's summary

DTO 객체가 서버와 클라이언트 사이에서 데이터를 주고받을 때

Jackson을 기반으로 직렬화(Java 객체 → JSON)와 역직렬화(JSON → Java 객체) 과정을 거친다.

 

✅ 역직렬화 (JSON → Java 객체)

클라이언트에서 JSON 데이터를 보내면 서버에서는 해당 JSON을 DTO 객체로 변환한다.

 

이때 Jackson은 내부적으로 기본 생성자로 DTO 객체를 생성하고

 

JSON의 key와 일치하는 setter 메서드를 찾아 값을 주입한다.

 

즉, 역직렬화에서는 기본 생성자setter가 필요하다 ‼️

 

✅ 궁금증이 생김

🧐 @Setter가 없는데도 값이 들어가는 경우가 있다?

 

이 경우 Jackson이 필드에 직접 접근(Reflection) 하여 값을 주입하는 것이다.

 

하지만 @Getter가 있을 때는 값이 들어가고, 아무것도 없을 때는 값이 안 들어가는 현상도 존재한다.

 

그 이유는 @Getter가 Jackson에게 해당 필드가 직렬화/역직렬화 대상임을 암시하는 힌트 역할을 하기 때문이다.

 

✅ 직렬화 (Java 객체 → JSON)

서버가 DTO 객체를 응답으로 줄 때는 Java 객체를 JSON으로 변환한다.

 

이때 Jackson은 기본적으로 getXxx() 형태의 getter 메서드를 찾아 값을 읽고,

해당 필드명을 key로 사용하여 JSON을 구성한다.

 

따라서 직렬화 시에는 getter가 필수다 ‼️

 

⭐️ Problem

DTO에서 아무런 어노테이션도 없으면 값이 제대로 주입되지 않는 문제 발생 했다.

 

@Setter 없이도 값이 들어가는 줄 알았지만, 특정 조건에서만 가능했다.

 

@Getter가 단순히 값을 꺼내는 용도인데, 역직렬화에도 영향을 주는 이유가 궁금했다.

 

결국 Jackson이 필드 직접 접근을 하느냐 안 하느냐는 내부 설정 및 힌트 여부에 따라 달라진다는 점이

문제의 핵심이였다‼️

 

 

 

⭐️ Try

  1. @NoArgsConstructor만 붙이고 @Setter 없이 테스트 → 값이 들어오지 않음
  2. @NoArgsConstructor + @Getter → 값이 들어옴 값을 넣는 건 setter가 아니라 필드 직접 접근
  3. @Getter가 Jackson에게 해당 필드를 직렬화/역직렬화 대상임을 알려주는 역할을 한다는 점을 알게되었다.
  4. 결국 가장 안전하고 명확한 코드는 아래의 코드와 같다는 결론이 내려졌다 ‼️ 
@Getter
@Setter
@NoArgsConstructor
public class CreateDto {
    private String user_id;
    private String user_pw;
}

 

 


 

항상 강의시간에 저 어노테이션들이 어느 경우에 붙고 어느 경우에 붙지 않는지 많이 헷갈려서 정리해보았다.

 

이런 궁금증을 참지 못하여 공부시간이 남들보다 배로 느는거 같은데 이시간이 아깝지 않게 까먹지 않고 잘 기억하고 있어야겠다.