(졸업작품) 스프링 부팅으로 작업한 문키를 되돌아보며 (4)

  • by

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/@aidenshin/%EB%82%B4%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-JPA -%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%9E%91%EC%84%B1-%EC%9B%90%EC%B9%99

https://velog.io/@alicesykim95/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AC%B4%EA%B2%B0%EC%84%B1