-
JPA Entity에서 @Setter 대신 @Builder를 권장하는 이유인턴 2025. 7. 3. 13:11728x90
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
외부에서 값이 언제든 변경 가능 객체 생성 시점에만 값 세팅, 변경 불가 데이터 무결성 약함 불변성, 일관성 보장 객체 완성 전 불완전 상태 완성된 객체만 전달 실수, 버그 발생 위험 ↑ 생성자/필드 순서 헷갈릴 일 없음 도메인 메서드 작성 불필요 비즈니스 메서드로만 상태 변경 유도 '인턴' 카테고리의 다른 글
이펙티브자바-[Lambda와 Stream] - 3 / 표준 함수형 인터페이스를 사용하자 (2) 2025.07.07 이펙티브자바-[Lambda와 Stream] - 2 / 람다보다는 메서드 참조를 사용하라 (0) 2025.07.07 이펙티브자바-[Lambda와 Stream] - 1 / 익명 클래스보다는 람다를 사용해라 (0) 2025.07.07 try-with-resourece를 사용해야 하는 이유 (1) 2025.07.03 Spring에서 사용되는 생성자 관련 Annotation 정리 (0) 2025.07.03 - Entity에 @Setter를 붙이면 모든 필드의 값이 언제 어디서나 바뀔 수 있음