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

2025. 10. 22. 18:32·스프링

Data

@Data는 Lombok에서 제공하는 어노테이션이다.
한 줄로 여러 기능을 자동으로 생성해 준다.

@Data = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor

포함된 기능

  • @Getter: 모든 필드의 getter 생성

  • @Setter: 모든 필드의 setter 생성

  • @ToString: toString() 메서드 생성

  • @EqualsAndHashCode: equals(), hashCode() 메서드 생성

  • @RequiredArgsConstructor: final 필드 또는 @NonNull 붙은 필드 생성자 생성

왜 @Data 를 쓰면 안좋은가?

1.모든 필드에 대해 Getter/Setter 생성

  • 캡슐화 원칙에 어긋난다.

  • -Setter는 객체를 언제든지 변경할 수 있는 상태로 만들기에 객체의 안정성을 보장받기 어렵다.

  • 예를 들어 id의 필드가 변경을 허용치 않기로 했다면 setter도 없어야 안정성이 보장된다. 하지만 @Data를 사용하면 id 필드도 setter가 생성되기 때문에 안정성을 보장 받을 수 없게 된다

    2.무분별한 toString() 생성

  • @ToString이 자동으로 생성디는데

  • JPA 연관관계가 (@ManyToOne, @OneToMany)가 있을 경우, 무한루프 발생 할수 있음

    3.무분별한 equals() & hashCode() 생성

  • 엔티티의 식별자인 id가 아직 할당되지 않은 상태에서 비교가 되면, 영속성 컨텍스트에서 문제가 발생할 수 있음

    @Data의 올바른 사용법

  • 필요한 어노테이션만 명시적으로 쓰면 된다.

    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Entity
    public class User {
      private Long id;
      private String name;
    
      // setter가 필요 없는 경우 생략
    }

필요하다면 개별 필드에만 @Setter 추가하면 된다.

저작자표시 비영리 (새창열림)

'스프링' 카테고리의 다른 글

Spring Validation 완전 정복 - 올바른 유효성 검증 전략  (0) 2026.01.29
스프링에서 스코프(Scope)란 무엇인가?  (0) 2026.01.19
스프링을 스프링답게 만드는 진짜 이유: IoC·AOP·PSA 삼각형의 정체  (0) 2026.01.18
스프링 배치란?  (0) 2025.12.11
@Data 사용을 지양해야 하는 이유  (0) 2025.04.21
'스프링' 카테고리의 다른 글
  • 스프링에서 스코프(Scope)란 무엇인가?
  • 스프링을 스프링답게 만드는 진짜 이유: IoC·AOP·PSA 삼각형의 정체
  • 스프링 배치란?
  • @Data 사용을 지양해야 하는 이유
깊은바다속꼬북이
깊은바다속꼬북이
  • 깊은바다속꼬북이
    CodeBlossom
    깊은바다속꼬북이
  • 전체
    오늘
    어제
    • 분류 전체보기 (53) N
      • 라이징 캠프 (4)
      • 객채지향 개발론 (3)
      • 스프링 (10) N
      • 네트워크 (2)
      • 자바 (16)
      • 자료구조 (3)
      • 운영체제 (0)
      • 데이터베이스 (4)
      • 디자인패턴 (7)
      • JSP (1)
      • 개발 알쓸신잡 (2)
      • 일반 교양 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    템플릿 메서드 패턴(Template Method Pattern)
    java
    GC
    자바 Socket 클래스
    자료구조
    java data area
    객체지향
    JVM
    한국어 검색
    트랜잭션 전파레벨
    java 버전별 특징
    어댑터 패턴(Adapter Pattern)
    개발 철학
    jvm 클래스 로더
    싱글턴 패턴(Singleton Pattern)
    백엔드
    MySQL 옵티마이저
    개발 교훈
    MySQL 파서
    프로그램밍 언어
    junnit5프레임워크
    spring
    전략 패턴(Strategy Pattern)
    jit-compiler
    JUnnit5
    스프링
    개발자 철학
    mockito라이브러리
    디자인 패턴
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
깊은바다속꼬북이
@Data 사용을 지양 해야 하는 이유
상단으로

티스토리툴바