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

2025. 4. 21. 11:34·스프링

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

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바