멤버와 오더가 있을 때. 회원이 주문을 하는 것이지만, 멤버와 오더를 동급으로 두고 고민해야 한다.
실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것으로 충분하다.
Getter는 모두 열어두는 것이 편하다.
Setter는 모두 열어두면 엔티티가 왜 변경되는지 추적하기 힘들어지기 때문에 Setter를 제공하는 것 대신에, 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공해야 한다.
@Embeddable
@Getter
public class Address {
private String city;
private String street;
private String zipCode;
protected Address() {}
public Address(String city, String street, String zipCode) {
this.city = city;
this.street = street;
this.zipCode = zipCode;
}
}
값 타입은 변경 불가능하게 설계해야 한다.
@Setter를 없애고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스로 만들어야 한다.
JPA 스펙 상 엔티티나 임베디드 타입은 자바 기본 생성자를 public이나 protected로 설정해야 하는데, protected로 설정하는게 더 안전하다.
엔티티 설계 시 주의점
- 엔티티에는 가급적 Setter를 사용하지 말자
- Setter가 모두 열려있으면 변경 포인트가 너무 많아서 유지보수가 힘들다.
- 모든 연관관계는 지연 로딩으로 설정하자
- 컬렉션은 필드에서 초기화하자
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
- 연관 관계 편의 메서드
public void addChildCategory(Category child) {
this.children.add(child);
child.setParent(this);
}
728x90
'Spring' 카테고리의 다른 글
Spring Security 없이 비밀번호 암호화, 로그인 구현하기 (0) | 2024.06.30 |
---|---|
[JPA 활용 1편 복습] 회원, 상품 도메인 개발 (0) | 2024.06.28 |
[JPA 기본편] 객체지향 쿼리 언어2 - 중급 문법 (0) | 2024.06.26 |
[JPA 기본편] 객체지향 쿼리 언어1 - 기본 문법 (0) | 2024.06.25 |
[JPA 기본편] 값 타입 (0) | 2024.06.24 |