도메인 모델과 테이블 설계
관계형에서는 *부분에 외래키가 존재한다.
외래키가 존재하는 곳이 연관관계의 주인이 된다.
연관관계의 주인은 단순히 외래키를 누가 관리하냐의 문제이다.
비즈니스상 우위에 있다고 주인으로 정하면 안된다.
예를들어, 자동차와 바퀴가 있으면
일대다 관계에서 항상 다쪽에 외래키가 있으므로
외래키가 있는 바퀴를 연관관계의 주인으로 정하면 된다.
물론 자동차를 연관관계의 주인으로 정하는 것이 불가능한 것은 아니지만
자동차를 연관관계의 주인으로 정하면
자동차가 관리하지 않는 바퀴 테이블의 외래키 값이 업데이트되므로
관리와 유지보수가 어렵고 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제도 있다.
객체 기준으로는 변경 포인트가 두 군데가 되는데
테이블 기준으로는 외래키 하나만 변경하면 된다.
둘 중에 하나를 주인이라는 개념으로 잡는다. 이것이 연관관계의 주인.
즉, 회원이나 주문 중 그 안에서의 하나의 값이 바뀌었을 때 외래키를 바꿀거야라고 지정하는 것이 연관관계의 주인을 만드는 것이다.
연관관계의 주인은 외래키와 가까운 곳으로 하면 된다.
[회원 주문 상품의 관계]
1. 회원-주문
회원은 여러 상품 주문 가능
회원1 주문*
다대일 양방향 관계
주문에 있는 회원아이디가 연관관계의 주인이 된다.
회원 도메인에서 주문은 조회용으로만 쓰이게 되는 것이고.
- 주문 기준에서 회원은 @ManyToOne
(여러 주문이 하나의 회원에게서 나타날 수 있기 때문에)
- 회원 기준에서 주문은 @OneToMany
(하나의 회원이 여러개의 상품을 주문하기 때문에)
2. 주문-상품
회원이 한번 주문할 때 여러개 상품 주문가능
상품도 여러 주문에 담길 수 있음
주문* 상품* 다대다관계
따라서 중간에 주문상품을 넣어서
주문1 주문상품* / 주문상품* 상품1
의 관계가 만들어진다.
1) 주문1 주문상품* ( 한번 주문할 때 여러개의 상품을 선택해서 넣으니까.)
다대일 양방향 관계
주문상품에 있는 주문아이디가 연관관계의 주인이 된다.
주문 도메인에서 주문상품은 조회용으로만 쓰이게 되는 것이고.
2) 주문상품* 상품1
다대일 단방향 관계 (상품은 주문상품을 찾을 일이 없다. 상품을 볼 때 나를 주문한 주문상품을 다 찾아 라는 걸 할 이유가 없으므로)
주문상품에 있는 상품아이디가 연관관계의 주인이 된다.
상품 도메인에서는 주문상품을 참조할 일이 없다.
3. 주문-배송
한 주문당 배송이 한번 발생한다.
주문1 배송1
일대일 단방향 관계
외래키가 있는 곳이 연관관계의 주인이 된다고 했는데
일대일의 경우에는 두 곳 중 어떠한 곳에도 둘 수 있다.
따라서, 외래키가 있는 곳인 주문이 연관관계의 주인이 된다.
4. 카테고리-상품
카테고리* 상품*
다대다 관계 (실무에서는 사용하지 말자.)
주문-상품과 같에 카테고리상품을 중간에 만들어서
다대일 관계로 푼다.
김영한님 강의 중 공부 기록