Hansel
스프링부트 기초 / 도메인 설정 본문
우선 DB 모델을 작성한 후에 그에 맞는 객체지향 스타일의 도메인 모델 작성이 필요하다.
1. 엔티티 작성
필드는 더 있지만 우선 생략하고 멤버와 오더는 1:M 관계를 가진다.
이를 엔티티 클래스로 작성할 때는 고려할 점이 양방향 관계로 설정할지와 누가 FK를 관리할지 필요하다.
M쪽이 FK를 관리해야 하니 MappedBy는 Member에 작성해야 하고 Orders는 JoinColumn으로 매핑해준다
오더와 딜리버리 (1:1)
1대1 관계의 경우 신경 쓸 점은 누가 FK를 가지는지이다.
사용할 일이 더 많은 곳에 두면 편하다. 배송보다는 Orders가 더 사용할 일이 많으니 Orders가 Fk를 가지게 하자.
Order & Order_Item & Item
Order와 Item은 m:m 관계이다. 하나의 주문엔 여러 아이템이 포함될 수 있고 하나의 아이템은 다수의 주문에 속할 수 있다.
M:M 관계는 반드시 해소해야 하는 관계이기 때문에 관계 테이블인 OrderItem을 생성하여 다대다를 해소한다.
다대다 매핑의 경우 1:M & M:1로 해소가 되었기 때문에 일대다 관계에 맞게 어노테이션을 설정해주면 된다.
당연하듯이 FK는 OrderItem이 관리한다.
값 타입은 변경 불가능 하도록
주소는 임베디드 타입이다. 이런 타입에 Setter를 설정해두면 값 타입을 수정할때 문제가 발생할 수 있다.
따라서 변경이 불가능 하도록 다음과 같이 설정한다.
카테고리 설정
카테고리와 아이템은 다대다 관계이다. 해소를 위해 중간 관계 테이블이 필요하다.
이와 더불어 카테고리는 하위 카테고리와 상위 카테고리가 있을 수 있다.
따라서 그에 맞는 재귀적인 관계가 필요하다.
엔티티 개발 시 주의사항
- setter는 가급적이면 사용해선 안된다. 협업시 혼동이 있을 수도 있고 잘못된 값이 입력될 수도 있다.
- 즉시 로딩은 예측이 어렵다. 따라서 지연 로딩으로 한다. 조회가 연달아 필요한 경우 join fetch를사용한다.
- OneToOne 과 ManyToOne은 기본이 즉시 로딩이기 때문에 가급적이면 lazy(지연 로딩)로 해주는게 좋다.
- 하나에 종속적인 관계는 Cascade를 사용해 편리함을 추구하자.
- 연관관계 메서드를 사용해 연관 관계를 한번에 잡아주자
'Spring > 기초' 카테고리의 다른 글
스프링부트 기초 / 도메인 설정 2 (0) | 2022.02.21 |
---|---|
스프링부트 기초 / Repository & Service (0) | 2022.02.21 |
스프링부트 기초 / 환경설정 (0) | 2022.02.21 |
싱글톤 컨테이너 (0) | 2022.02.04 |
싱글톤 패턴 (0) | 2022.02.04 |