3. Entity에서 Setter를 사용하면 객체 일관성을 보장하기가 어렵습니다.
(1) 데이터 무결성, 일관성 저해
Entity 클래스는 데이터를 나타내는 클래스로 사용됩니다.
이 클래스에는 데이터베이스 테이블 열과 해당 필드가 포함됩니다.
이러한 필드는 비공개로 선언되어 외부에서 직접 액세스할 수 없지만 공용으로 선언된 getter 및 setter 메서드를 통해 이 필드에 액세스할 수 있습니다.
그러나 세터를 무분별하게 사용하는 경우 데이터 무결성이 손상될 수 있습니다.
예를 들어, Entity의 필드 중 하나가 null이면 setter를 사용하여 해당 필드에 null 값을 할당하면 데이터 무결성이 손상됩니다.
(데이터 무결성 중 객체 무결성)
Entity 필드가 null일 수 있는 경우 setter를 통해 null 값을 설정하면 데이터 무결성이 손상될 수 있는 이유는 무엇입니까?
Q. 엔티티 필드가 null이 될 때 setter를 통해 null을 입력하면 데이터 무결성이 손상되는 이유는 무엇입니까?
또한, setter를 사용하여 Entity 필드를 임의로 변경그러면 데이터베이스 일관성이 손상될 수 있습니다.
Setter를 무차별적으로 남용하면 Entity의 값을 변경할 수 있으므로 개체의 일관성을 보장할 수 없습니다.
객체 일관성을 유지하기 위해 객체를 만들 때 값을 넣어 세터 사용을 줄일 수 있습니다.
// 1. 빌더패턴 사용
Member meber = Member.Builder()
.username("name")
.tel("01012345678")
.build();
// 2. 객체 생성자 설정
@Bean
public Member(String username, String tel){
this.username = username;
this.tel = tel;
}
또는 기본 생성자 액세서를 protected로 변경하면 new Member() 의 사용을 막을 수 있어 오브젝트의 일관성을 한층 더 유지할 수 있다.
protected 로 설정하는 이유는, JPA 기본 사양상, 기본 생성자가 필요해, protected 로 제어할 때까지 허가되기 때문입니다.
@Entity
@Getter
public class Member{
...
protected Member(){}; // 기본 생성자 protected로 접근 제어
}
또는 롬복을 사용하여 @NoArgsconstructor 어노테이션(파라미터 없는 기본 생성자 생성) 설정으로 쉽게 설정할 수 있습니다.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member{
...
protected Member(){}; // 기본 생성자 protected로 접근 제어
}
(2) 세터는 의도를 알기 어렵다.
Setter 메서드를 통해 필드 값 변경 이것은 무엇을 하는 메소드인지 한 번에 모른다.
Member member = new Member();
member.setName("이름2");
member.setTel("01012345678");
...
member.set...
위의 예와 같이 간단한 변경의 경우는 알 수 있지만,
복잡해지면 객체의 값을 변경하는 행위가 무엇을 위해 변경되는지 한눈에 알 수 없습니다.
그러므로 코드처럼 객체에서 메서드를 제공하고 변경그러면 변경 의도를 한 번에 알 수 있으며,
객체 자체의 값을 변경하는 것은 객체 지향의 관점에서도 더 정확합니다.
member.changeBasicInfo("이름2", "01012345678");
// 멤버의 기본정보를 수정한다는 것을 한 눈에 알 수 있는 메소드 이름
// Member Entity 내부 메소드
public void changeBasicInfo(String name, String tel){
this.name = name;
this.tel = tel;
}
(3) 결론
따라서 Java Spring에서는 Enity 클래스에 필요한 경우에만 Setter를 사용하는 것이 좋습니다.
만약 Entity 클래스의 상태를 변경해야 하는 경우는, 그 필드를 초기화하는 생성자를 이용하거나, 다른 메소드를 사용해 변경하는 것이 안전하다.
무분별한 세터 사용 금지 엔티티뿐만 아니라 오브젝트의 작성·변경시에도 대응하는 부분이다,
객체 일관성을 유지할 수 없으면 프로그램의 서비스 가능성을 높일 수 있기 때문에에 일급 컬렉션 상용 등 많은 개발자가 개체의 일관성을 유지하기 위해 노력을 기울이고있다.
Reference
– chat gpt
– https://velog.io/@alicesykim95/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AC%B4%EA%B2%B0%EC%84%B1