[JPA] Entitiy에서 왜 Setter를 사용하지 말라고 할까?

어느 책에서나 어느 강의에서나 Entity에서는 Setter를 사용하는 것을 지양한다고 한다.

그렇다면 왜 setter를 지양할까 ?

 

setter를 지양하는 이유

사용한 의도를 쉽게 파악하기 어렵다.
Member member = new Member();
member.setUsername("김갑동");
member.setAge(50);

위 코드를 보면 member에 값을 설정하는 것은 알겠는데

이게 값을 생성하는 것인지, 값을 변경하는 것인이 의도를 파악하기 힘들다.

그리고 엔티티의 필드가 더 많을 수록 한눈에 파악하는 것이 힘들어진다.

 

일관성을 파괴한다.
public Member updateMember(Long id) {
     Member member = findById(id);
     member.setUsername("박해수"); // 이름 변경
     member.setAge(70); // 나이 변경
     return member;
}

위 코드는 Member의 정보를 변경하는 메서드인데

setter 메서드는 항상 public으로 어디든 접근 가능하기 때문에 의도치 않게 다른곳에서 Member의 값이 변경될 수가 있다.


setter 대신 어떻게 엔티티 값을 설정하고 변경해야하나?

값을 생성할 때에는 생성자를 통해 값을 넣어 일관성을 유지한다. 
@Getter
@Entity
@NoArgsConstructor
public class Member {

    @Id
    @GeneratedValue
    private Long id;

    private String username;

    private int age;

	@Builder // 롬복의 빌더 패턴
    public Member(String username, int age) {
        this.username = username;
        this.age = age;
    }
}

Entity의 일관성을 유지하기 위해 생성시점에 값을 넣는 생성자 방식을 통해 값을 생성할 수 있다.

이 경우 Lombok의 빌더 패턴을 사용할 수도 있다.

 

[Spring] Lombok(롬복)이란 ? 설치부터 사용법까지

Lombok 이란? Java의 라이브러리로 반복되는 메서드를 Anntation을 사용해 자동으로 작성해주는 아주 편리한 라이브러리입니다. Java에서 보통 Model 클래스나 Entity같은 도메인 클래스 등에는 여러 속성

hstory0208.tistory.com

 

 

값을 변경할 경우 의도를 알 수 있는 메서드를 작성한다.

값을 변경해야할 경우 다음과 같이 메서드 이름을 통해 어떤 기능을 수행하는지 알 수 있도록 해야한다.

public void updateMember(String username, int age) {
        this.username = username;
        this.age = age;
}

...

member.updateMember("박해수", 70)