Spring + JPA로 개발하다 보면 엔티티 값 변경을 어떻게 처리할지 머리 아파진다.
이때, 할 수 있는 선택지는 두 가지다.
set필드명() 을 호출하는 방식update()나 change(), rename() 같은 메서드를 정의하는 방식뭘 써야 할까나
member.setName("홍길동");
member.setAddress("서울");
어디서든 setter만 호출하면 값이 바뀝니다.
심지어 특정 로직에서 실수로 잘못된 값이 들어와도 막을 방법이 없다.
“가격은 0원 미만이면 안 된다”,
“이메일은 변경 불가능하다”
이런 규칙을 setter는 전혀 보호할 수 없다.
엔티티가 단순 데이터 구조체처럼 변하고,
“도메인의 의미 있는 상태 변화”를 표현하지 못함.
엔티티에 함수를 하나 파는거다.
public void changePrice(int price) {
if (price <= 0) throw new IllegalArgumentException("가격은 0보다 커야 합니다.");
this.price = price;
}
잘못된 값이 엔티티로 진입하는 순간 바로 차단.
엔티티가 데이터 보관소가 아니라
“스스로 보호하며 의미 있게 변하는 객체”가 됨.
product.changePrice(10000);
product.rename("새 상품명");
이 코드를 보는 것만으로 “무엇을” 하는지 바로 이해가 됨.
setter 방식에서는 어디서 값이 바뀌는지 추적하기 어려움.
하지만 update 메서드를 쓰면 “이 필드를 언제 수정할 수 있는지”가 명확해짐.
-> 함수 하나 파서 써라~!