ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA Entity에서 @Setter 대신 @Builder를 권장하는 이유
    인턴 2025. 7. 3. 13:11
    728x90

    1차 과제에 JPA로 개발중 @Setter와 @Builder 둘 중에 무엇을 사용해야할 지 고민하던 중 자세히 알고 넘어가기 위해 작성하게 되었다.

     

    1. JPA Entity에서 @Setter의 문제점

    1.1 @Setter 남발의 문제

    • Entity에 @Setter를 붙이면 모든 필드의 값이 언제 어디서나 바뀔 수 있음
      • 객체의 상태가 쉽게 깨지고, 예측 불가능한 버그가 생김
    • Entity는 도메인 모델(비즈니스 핵심 데이터)
      • 일관성 보장이 매우 중요함
    • setter 사용은 아래와 같은 실수를 유발할 수 있음
      • 저장 전/후 값이 외부에서 불특정 시점에 변경될 수 있음
      • Entity 객체가 DB에 매핑되는 시점과 값이 바뀌는 시점이 불일치 >> 데이터 무결성 위험 

    1.2 setter 남용의 예

    user.setName("kim");
    user.setLevel("admin");
    user.setDesc("관리자");
    • 여러 줄로 값이 변경되어 객체 완성 전까지 "불완전한 상태"일 수 있음

    2. JPA Entity에서 @Builder를 쓰는 이유

    2.1 객체 생성의 일관성 및 불변성 보장

    • @Builder로 객체를 생성하면 >> 한 번에 모든 필드가 채워진 "완성된 객체"가 생성됨
    • 필드의 변경을 외부에서 마음대로 못하게 막고 >> 생성 시점에만 값이 고정
    • 불변 객체에 가깝게 만들 수 있어 데이터 일관성을 크게 높임

    2.2 코드 가독성 / 안정성 상승

    • 필드가 많아질수록 builder는 가독성에 큰 장점
    • 어느 필드에 어떤 값이 들어가는지 한눈에 명확(생성자나 setter는 순서 헷갈림, 누락 실수 발생)

    2.3 객체 변경은 비즈니스 메서드로만 !!

    • Entity에 setter를 없애면, 값 변경은 반드시 비즈니스 메서드를 통해서만 가능 >> 로직의 명확성, 무결성 보장 

    3. 실전 예시

    @Setter 사용 시 문제점

    // user 객체가 외부에서 언제든 값이 변경될 수 있음
    user.setName("A");
    user.setLevel("USER");
    user.setLevel("ADMIN"); // 어디서든 다시 바꿀 수 있음 → 예측 불가

    @Builder 사용 시

    User user = User.builder()
        .id("kim")
        .name("김종현")
        .level("ADMIN")
        .desc("설명")
        .build();
    // 생성 이후 값이 변경 불가(Setter 없음)

    요약. JPA Entity에 @Builder 적용 권장 이유.

    @Setter와 @Builder

    외부에서 값이 언제든 변경 가능 객체 생성 시점에만 값 세팅, 변경 불가
    데이터 무결성 약함 불변성, 일관성 보장
    객체 완성 전 불완전 상태 완성된 객체만 전달
    실수, 버그 발생 위험 ↑ 생성자/필드 순서 헷갈릴 일 없음
    도메인 메서드 작성 불필요 비즈니스 메서드로만 상태 변경 유도
Designed by Tistory.