본문 바로가기
BackEnd/JPA

[JPA] 도메인 분석 설계(1)

by 개발 Blog 2024. 9. 23.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

요구사항 분석

기능 목록

 

  • 회원 기능
    • 회원 등록
    • 회원 조회
  • 상품 기능
    • 상품 등록
    • 상품 수정
    • 상품 조회
  • 주문 기능
    • 상품 주문
    • 주문 내역 조회
    • 주문 취소
  • 기타 요구사항
    • 상품은 재고 관리가 필요하다.
    • 상품의 종류는 도서, 음반, 영화가 있다.
    • 상품을 카테고리로 구분할 수 있다.
    • 상품 주문시 배송 정보를 입력할 수 있다.

 

도메인 모델과 테이블 설계

회원, 주문, 상품의 관계: 회원은 여러 상품을 주문할 수 있으며, 한 번 주문할 때 여러 상품을 선택할 수 있어 주문과 상품은 다대다 관계다. 이런 다대다 관계는 주문상품 엔티티를 추가해 일대다, 다대일 관계로 풀어낸다.

상품 분류: 도서, 음반, 영화로 분류되며, 상속 구조로 표현된다.

 

회원 엔티티 분석

  • 회원(Member): 회원은 이름과 주소(Address), 그리고 주문 리스트(orders)를 가진다. 주소는 값 타입으로 임베디드되어 있다.
  • 주문(Order): 주문은 여러 주문 상품(OrderItem)을 포함할 수 있는 일대다 관계다. 주문은 주문한 회원 정보, 배송 정보(Delivery), 주문 날짜(orderDate), 주문 상태(status)를 가진다. 주문 상태는 열거형으로 ORDER와 CANCEL로 구분된다.
  • 주문 상품(OrderItem): 주문한 상품 정보, 주문 금액(orderPrice), 주문 수량(count)을 가진다.
  • 상품(Item): 상품은 이름, 가격, 재고 수량(stockQuantity)을 가지며, 상품 주문 시 재고가 감소한다. 상품의 종류는 도서, 음반, 영화로 분류되어 상속 구조로 표현된다.
  • 배송(Delivery): 주문과 일대일 관계로, 배송 정보는 하나의 주문에 대응된다.
  • 카테고리(Category): 상품은 다대다 관계를 형성하지만, 실제로는 CategoryItem을 통해 다대일, 일대다 관계로 관리된다. 카테고리는 부모 카테고리(parent)와 자식 카테고리(child)로 연결된다.

참고사항

  • Order와 Delivery는 양방향 관계로 설계되어야 하나, 도식에서는 단방향으로 잘못 표시되었다.
  • 일반적으로 주문이 회원을 참조하는 구조가 객체 관리와 유지보수에 더 효과적이다. 

회원 테이블 분석

 
  • MEMBER: 회원 엔티티에서 Address는 임베디드 타입으로, 회원 테이블에 직접 포함되어 있다. 주소 정보는 도시(city), 거리(street), 우편번호(zipcode)로 구성된다.
  • ITEM: 앨범, 도서, 영화의 세부 정보는 하나의 Item 테이블에서 관리된다. 각 항목은 DTYPE 컬럼을 사용하여 구분한다, 여기서 DTYPE은 각 아이템의 타입을 나타내는 디스크리미네이터 값이다.

참고사항

  • 테이블 이름: 일반적으로 ORDER라는 이름은 SQL의 예약어 ORDER BY와 충돌할 수 있으므로, 대부분의 데이터베이스 스키마에서는 ORDERS로 명명한다.
  • 네이밍 컨벤션: 실제 데이터베이스 설계 시 사용하는 컬럼명은 대문자와 언더스코어(_)를 사용하는 것이 일반적이지만, 코드 상에서는 소문자와 언더스코어를 사용하여 SQL과 코드 간의 구분을 명확히 한다. 이는 가독성과 관리의 편의성을 높이기 위함이다.

연관관계 매핑 분석

  • 회원과 주문: 회원과 주문은 일대다, 다대일의 양방향 관계다. Order.member를 ORDERS.MEMBER_ID 외래 키와 매핑하여 연관관계의 주인으로 한다.
  • 주문상품과 주문: 주문상품은 주문에 대한 다대일의 양방향 관계다. OrderItem.order를 ORDER_ITEM.ORDER_ID 외래 키와 매핑한다.
  • 주문상품과 상품: OrderItem.item을 ORDER_ITEM.ITEM_ID 외래 키와 매핑하는 다대일 단방향 관계다.
  • 주문과 배송: 주문과 배송은 일대일 양방향 관계로, Order.delivery를 ORDERS.DELIVERY_ID 외래 키와 매핑한다.
  • 카테고리와 상품: 실무에서는 @ManyToMany 관계를 사용하지 않으나, 예제에서는 이를 사용하여 카테고리와 상품간의 다대다 관계를 설명한다.

참고사항

  • 외래 키가 있는 위치를 연관관계의 주인으로 설정해야 한다. 이는 외래 키 관리의 효율성 때문이며, 비즈니스 로직의 우위와는 무관하다.