DTO 객체에 @Data 를 지양해야하는 이유

알파로그·2024년 1월 29일
0

Code conventions

목록 보기
4/4

✏️ 발단

나는 평소에 DTO 에 편의상 @Data 를 선언해 관리한다.

이유는 단순 데이터를 전달하기 위한 객체로 비즈니스 로직 상에서 데이터가 변경되어도 크리티컬한 문제가 생기지 않는다고 생각했고,
테스트할 때 DTO 인스턴스를 생성하기 편리하기 때문에다.

하지만 @Data 엔 객체지향에서 가급정 지양해야 할 Setter 외에도 불필요한 기능들이 들어있기 때문에
참조가 꼬인다면 에러가 발생할 수 있다는 사실을 알았다.

이번기회에 DTO 와 lombok 의 사용 이유를 정확하게 알고 넘어가고싶어 새롭게 알게된 내용을 정리해봤다.

✏️ DTO

  • Data Transfer Object 의 약자로 Rest api 작성시 Entity 대신 데이터를 주고받는 용도로 사용된다.
    • Entity 의 변질을 막고, 필요한 필드만 주고 받을 수 있는 장점이 있다.
  • Controller 에서 DTO 를 주고받기 때문에 JSON 직렬화와 역직렬화가 일어난다.
    • 직렬화 (serialization) - Java Object → JSON
      • ResponseBody 를 사용할 때 일어난다.
    • 역직렬화 (deserialization) - JSON → Java Object
      • RequestBody 를 사용할 때 일어난다.

✏️ 직렬화와 역식렬화

📍 필요한 lombok 어노테이션

  • Spring Boot 에서 DTO 를 직렬, 역직렬화 할 때 Jackson 이 작동된다.
    • Jackson 내부에서는 ObjectMapper 가 Java reflection 을 사용하는데 이때 Getter, Settet, 기본생성자가 필요하다.
직렬화   -> Getter 만 있으면 됨
(기본 생성자도 필요 없음)

역직렬화  -> Getter, 기본생성자 필요
(Getter 대신 Setter 도 가능)
  • 위와 같이 직렬화와 역직렬화는 많은 어노테이션을 요구하지 않는다.
    • 역직렬화는 Reflection 을 할 때 기본생성자를 생성한 후 Getter 나 Setter 를 사용해 필드를 가져오기 때문에 기본생성자가 필요하다.
  • 역직렬화의 기본성자는 ObjectMapper 의 reflection 에서 필요하기 때문에 다른 용도로 사용되지 않는다면 private 으로 접근 제한자를 사용해도 된다.

📍 lombok 이 필요하지 않는 경우

  • lombok 은 직렬화와 역직렬화를 위해 필요한 어노테이션이기 때문에 property 와 생성자가 위임된 경우는 lombok 을 전부 생략할 수 있다.
    • @JsonProperty, @JsonAutoDetect, @JsonCreator 가 해당된다.
    • 직렬화 역직렬화시 직접 쓰일 정보를 선언했기 때문이다.
profile
잘못된 내용 PR 환영

0개의 댓글