[JPA 활용 1] 도메인 분석 설계

강신현·2022년 6월 28일
0

동작화면

도메인 모델과 테이블 설계

  • 주문과 상품 : 다대다 관계 -> 일대다, 다대일 관계
    하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티 티에서도 거의 사용하지 않는다.
    따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대다, 다대일 관계로 풀어냈다.
  • 카테고리와 상품 : 다대다 관계
    다대다 관계는 좋지 않지만 다양한 예제를 위해 사용했다.

회원 엔티티 분석

  • 회원과 주문
    회원이 주문을 하기 때문에, 회원이 주문리스트를 가지는 것은 얼핏 보면 잘 설계한 것 같지만, 객체 세상은 실제 세계와는 다르다.
    회원과 주문은 동급으로 두고 생각해야 한다. 실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것이다.
    따라서 단방향이 맞지만 다양한 예제를 위해 양방향 관계를 사용했다.

회원 테이블 분석

  • ITEM 테이블
    앨범, 도서, 영화 타입을 통합해서 하나의 테이블로 만들었다.
    단일 테이블이기 때문에 앨범, 도서, 영화 타입 구분이 명확하지 않지만 성능면에서 좋다.
    TYPE 컬럼으로 타입을 구분한다.
  • ORDERS 테이블
    테이블명이 ORDER 가 아니라 ORDERS 인 것은 데이터베이스가 order by 때문에 예약어로 잡고 있
    는 경우가 많다. 그래서 관례상 ORDERS 를 많이 사용한다.
  • CATEGORY, ITEM 테이블
    회원 엔티티 분석에서 다대다 관계였던 두 테이블을 CATECORY_ITEM이라는 매핑 테이블을 두어 일대다, 다대일 관계로 풀어냈다.

- 테이블명, 컬럼명

데이터베이스 테이블명, 컬럼명에 대한 관례는 회사마다 다르다.
보통은 대문자 + (언더스코어)나 소문자 + (언더스코어) 방식 중에 하나를 지정해서 일관성 있게 사용한다.

- 매핑 테이블

매핑 테이블은 각 테이블의 PK를 외래 키로 참조하는 테이블로 값 집합을 저장할 때 주로 사용된다.
양방향 관계를 다대일, 일대다 관계로 풀어줄 때 사용됨 (RDS에서는 다대다 관계를 사용하지 않음)

  • CATEGORY_ID는 CATEGORY 테이블의 PK로, CATEGORY_ITEM의 외래키로서 어떤 CATEGORY인지 식별할 수 있고,
  • ITEM_ID는 ITEM 테이블의 PK로, CATEGORY_ITEM의 외래키로서 어떤 ITEM을 갖는지를 식별할 수 있게 된다.

그럼 다양한 ITEM을 같이 구매했을 경우의 문제를 해결할 수 있다.

연관관계 매핑 분석

외래 키가 있는 곳을 연관관계의 주인으로 정해라.

연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고 주인으로 정하면 안된다.
예를 들어서 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다쪽에 외래 키가 있으므로 외래 키가 있는 바퀴를 연관관계의 주인으로 정하면 된다.
물론 자동차를 연관관계의 주인으로 정하는 것이 불가능 한 것은 아니지만, 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래 키 값이 업데이트 되므로 관리와 유지보수가 어렵고, 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제도 있다.

  • 회원과 주문
    일대다, 다대일의 양방향 관계
    따라서 연관관계의 주인을 정해야 하는데, 외래 키가 있는 주문을 연관관계의 주인으로 정하는 것이 좋다.
    그러므로 Order.member 를 ORDERS.MEMBER_ID 외래 키와 매핑한다.
  • 주문상품과 주문
    다대일 양방향 관계
    외래 키가 주문상품에 있으므로 주문상품이 연관관계의 주인이다.
    그러므로 OrderItem.order 를 ORDER_ITEM.ORDER_ID 외래 키와 매핑한다.
  • 주문상품과 상품
    다대일 단방향 관계
    OrderItem.item 을 ORDER_ITEM.ITEM_ID 외래 키와 매핑한다.
  • 주문과 배송
    일대일 양방향 관계
    Order.delivery 를 ORDERS.DELIVERY_ID 외래 키와 매핑한다.
  • 카테고리와 상품
    다대다 관계
    @ManyToMany 를 사용해서 매핑한다.
    (실무에서 @ManyToMany는 사용하지 말자. 여기서는 다대다 관계를 예제로 보여주기 위함)
profile
땅콩의 모험 (server)

0개의 댓글