@Data를 사용해야한다 vs @Data를 지양해야한다.
개발 블로그를 찾다보면 의견이 분분한 것을 볼 수 있다.
필자는 "필요한 어노테이션을 @Data 하나로 전부 사용할 수 있네?"하며 단순히 편리한 어노테이션이라 생각하고 사용했다.
그러다 우연히 한 블로그를 보게 되었다.
@Data
@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 합쳐놓은 lombok 어노테이션이다.
POJO와 bean과 관련된 모든 보일러 플레이트를 생성한다.
※POJO?
: Plain Old Java Object, 자바로 생성하는 순수한 객체를 의미한다.
사람들이 @Data를 지양하는 이유?
블로그를 찾아보니 대부분의 사람들이 @Data 사용을 지양하고 있었다.
여러 이유들을 아래 두 가지로 추렸다.
- @Setter 존재
- 외부에서 필드를 변경할 때 변경 목적을 제대로 파악하는 것이 중요하다.
- setter를 사용한다면 의도가 불분명할 뿐만 아니라, 값의 일관성을 유지하기 어렵기 때문에 사이드 이펙트를 발생시킬 수 있다.
※ 사이드 이펙트란? 어떤 실행의 결과로 예상치 못한 효과가 나오는 것(꼭 사이드 이펙트가 나쁜 의미를 가지고 있는 것은 아니지만 여기서는 부정적인 의미로 쓰는 듯 하다)
- 생성자 인자 순서의 중요
- @AllArgsConstructor, @RequiredArgsConstructor를 모두 포함하기 때문에 객체를 생성할 때 인자의 순서가 매우 중요하다.
- 순서가 변경된다면?
- 원하는 값이 들어가지 않을 수 있음
- 버그 발생
장점을 알고 올바르게 사용하자
그래도 괜히 만들어진 어노테이션이라기엔 장점 또한 존재한다.
- 가독성 높은 코드를 작성할 수 있다.
- 유지보수성을 높일 수 있다.
그럼 @Data는 어떻게 사용해야하는 걸까?
- Entity 에서는 사용하지 말 것
- DB와 가장 밀접하게 관련있기 때문에 Entity에서 사용하는 것은 위험할 수 있다.
- Entity에서 @Setter를 사용하는 것은 지양되기 때문에 더더욱 엔티티에서는 사용하지 말자.
- DTO 에서 사용하자
- 데이터 전송을 위한 객체인 DTO에서 사용하는 것을 지향하자.
- @Getter, 응답을 반환할 때 @AllArgsContructor 가 필요한 DTO의 경우에도 @Data 하나로 사용할 수 있다.
- 모든 DTO에서 사용 시 일관성을 유지할 수 있다.
@Data 적용 예제
@Data
@Builder
public class NotificationResponse {
private List<NotificationItem> items;
private Integer unreadCount;
}
알림 목록 조회 요청 시 반환하는 응답 DTO이다.
@Data를 사용하여 다른 DTO들 간의 일관성을 유지하고 @Builder 패턴을 사용하여 객체를 생성하고 있다.
@Data를 사용함으로써 가독성 또한 챙겼다.

감사합니다 ╰(*°▽°*)╯
'Development > Back-end' 카테고리의 다른 글
| [NestJS] Pipe 사용하기 (1) | 2026.02.26 |
|---|---|
| [Spring Boot] 어댑터 패턴 구현하기(with. JPA, Redis) (0) | 2025.12.26 |
| [Spring Boot] Spring Security + JWT + Redis 로그아웃 구현하기 (0) | 2025.11.12 |
| [Spring Boot] JWT 서명 알고리즘 (2) - HS256 (0) | 2025.08.18 |
| [JWT] JWT 서명 알고리즘 (1) - HMAC, RSA (0) | 2025.08.18 |