반응형
어느 책에서나 어느 강의에서나 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의 빌더 패턴을 사용할 수도 있다.
값을 변경할 경우 의도를 알 수 있는 메서드를 작성한다.
값을 변경해야할 경우 다음과 같이 메서드 이름을 통해 어떤 기능을 수행하는지 알 수 있도록 해야한다.
public void updateMember(String username, int age) {
this.username = username;
this.age = age;
}
...
member.updateMember("박해수", 70)
'◼ JAVA > JPA' 카테고리의 다른 글
[JPA] JPQL이란? 사용방법, 기본 문법 총 정리 (1) | 2023.06.09 |
---|---|
[JPA] 임베디드 타입이란? (@Embeddable) (0) | 2023.06.08 |
[JPA] 영속성 전이(cascade)와 고아객체(orphalRemoval)란? (0) | 2023.06.07 |
[JPA] 상속관계 매핑, 매핑 정보 상속에 대해 알아보자. (0) | 2023.06.07 |
[JPA] 연관관계 매핑 총 정리 (0) | 2023.06.06 |