Hansel

스프링부트 기초 / 도메인 설정 본문

Spring/기초

스프링부트 기초 / 도메인 설정

핑슬 2022. 2. 21. 15:19

우선 DB 모델을 작성한 후에 그에 맞는 객체지향 스타일의 도메인 모델 작성이 필요하다.

 

1. 엔티티 작성

멤버와 오더 / 1:M

필드는 더 있지만 우선 생략하고 멤버와 오더는 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를 설정해두면 값 타입을 수정할때 문제가 발생할 수 있다.

 

따라서 변경이 불가능 하도록 다음과 같이 설정한다.

 

카테고리 설정

카테고리와 아이템은 다대다 관계이다. 해소를 위해 중간 관계 테이블이 필요하다.

이와 더불어 카테고리는 하위 카테고리와 상위 카테고리가 있을 수 있다.

따라서 그에 맞는 재귀적인 관계가 필요하다.

 

엔티티 개발 시 주의사항

Cascade
지연로딩
연관관계 메서드

  • setter는 가급적이면 사용해선 안된다. 협업시 혼동이 있을 수도 있고 잘못된 값이 입력될 수도 있다.
  • 즉시 로딩은 예측이 어렵다. 따라서 지연 로딩으로 한다. 조회가 연달아 필요한 경우 join fetch를사용한다.
  • OneToOneManyToOne은 기본이 즉시 로딩이기 때문에 가급적이면 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