[Java] @Data 사용을 지양해야 하는 이유

Hyo Kyun Lee·2025년 3월 18일
0

Java

목록 보기
91/91

1. 개요

지금까지 프로젝트를 진행하면서 MVC Pattern에서 사용한 DTO를 @Data 어노테이션 처리하였다.

일전에 무분별한 자원의 접근과 수정을 방지하기 위해 @Getter, @Setter 사용을 지양해야 한다는 사실은 알고 있었는데, @Data 역시 그 일환 중 하나인 것을 깨달았다.

프로젝트를 편리하게 하는 만큼 위험성이 따를 수 있다는 사실을 항상 숙지해야 한다는 것을 또 한번 느낄 수 있었고, 이에 대해 공부한 내용을 기록해 보았다.

2. @Data 사용을 지양해야 하는 이유

  • @Setter 남용

기본적으로, @Data는 @Getter, @Setter, @RequiredArgsConstructor, @AllArgsConstructor, @EqualsAndHashCode를 모두 포함하고 있는 어노테이션이다.

일전에 무분별한 @Setter 사용은 지양해야 한다는 점을 인지하였듯, DTO 및 VO자원의 요소를 변경할 수 있는 위험을 유발할 수 있으므로 사용을 지양해야 한다.

  • @ToString 남용으로 인한 순환참조 발생

1:N 관계, 정확히는 서로 참조 관계에 있기에 특정 VO의 객체를 필드 변수로 가지고 있는 상황이 발생한다면 @ToString으로 인하여 객체를 반복적으로 참조하여 stackoverflow가 발생하는 현상을 유발한다.

@Data 어노테이션에는 이러한 ToString 순환참조가 발생할 수 있기에, 남용하지 않아야 한다.

특히 @ToString의 경우, exclude하거나 특정 필드만을 override하는 방법이 있으므로 잘 선택하여 사용해야 한다.

  • @EqualsAndHashCode

예측하지 못한 자원 변경을 허용하게 되는 상황이 발생하여, 두 객체의 동등성을 평가할 수 없을 수 있다.

  • @AllArgsConstructor/RequiredArgsConstructor

자동적으로 모든 멤버 변수를 포함한, 혹은 조건에 맞는 (final 등) 변수를 포함한 생성자를 만들어 주는 어노테이션의 기능을 포함하므로, 이에 대한 남용을 방지해야 한다.

생성자의 경우 개발자의 실수로 필드 멤버 변수 누락 혹은 순서 혼란 등으로 인해 잘못된 생성자가 만들어질 위험이 있으므로, 역시 무분별한 사용을 지양해야 한다.

3. 참고자료

Data 어노테이션을 사용 지양 - https://velog.io/@penrose_15/Data%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0

ToString 사용 방법 - https://davidy87.tistory.com/12

ToString 순환 참조의 구조 - https://cornpip.tistory.com/28

Required/AllArgsConstructor 원리 - https://yoonseon.tistory.com/152

0개의 댓글

관련 채용 정보