요구사항 분석

기능 목록:

 회원 기능 - 회원 등록, 회원 조회

  상품 기능 - 상품 등록, 상품 수정, 상품 조회

  주문 기능 - 상품 주문, 주문 내역 조회, 주문 취소

  

기타 요구사항:

  상품은 재고 관리 필요

  상품의 종류는 도서, 음반, 영화로 한정

  상품을 카테고리로 구분 할 수 있음

  상품 주문시 배송 정보 입력 가능

 

도메인 모델, 테이블 설계

 

 

회원(Member): 이름과 임베디드 타입은 주소(Address), 그리고 주문(orders) 리스트를 가진다.

 

주문(Order): 한번 주문시 여러 상품을 주문 할 수 있으므로, 주문과 주문상품(OrderItem)은 일대다 관계, 주문은 상품을 주문한 회원과 배송정보, 주문 날짜, 주문 상태(status)를 가지고 있다. 주문 상태는 열거형을 사용했는데 주문(ORDER), 취소(CANCLE)을 표현 할 수 있다.

 

주문 상품(OrderItem): 주문한 상품 정보와 주문금액(orderPrice), 주문수량(count), 정보를 가지고 있다.(보통 OrderLine, LineItem으로 많이 표현한다.)

 

상품(Item): 이름, 가격, 재고수량(stockQuantity)을 가지고 있다. 상품을 주문하면 재고 수량이 줄어든다.

상품의 종류로는 도서, 음반, 영화가있는데 각각은 사용하는 속성이 조금씩 다르다.

 

배송(Delivery): 주문시 하나의 배송 정보를 생산한다. 주문과 배송은 일대일 관계.

 

카테고리(Category): 상품과 다대다 관계. parent, child로 부모, 자식 카테고리를 연결한다.

 

주소(Address): 값 타입(임베디드 타입). 회원과 배송에서 사용된다

 

 

회원 테이블 분석

 

MEMBER: 회원 엔티티의 Address 엠베디드 타입 정보가 회원 테이블에 그대로 들어갔다. Delivery 테이블도 마찬가지

ITEM: 앨범, 도서, 영화 타입을 통합해서 하나의 테이블로 만들었다. DTYPE 컬럼으로 타입을 구분한다.

 

참고: 테이블명이 실제 코드에서는 DB에 소문자 + _(언더스코어)스타일을 사용

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

 

연관관계 매핑 분석

 

회원과 주문: 일대다, 다대일 양방향 관계. 따라서 연관관계의 주인을 정해야하는데, 외래 키가 있는 주문을 연관관계의 주인으로 정하는 것이 좋다. 그러므로 Order.member를 ORDERS.MEMBER_ID 외래키와 매핑한다.

(보통 외래키가 있는게 주인이 됨 대부분 다수)

 

주문 상품과 주문: 다대일 양방향 관계이다. 외래키가 주문 상품에 있으므로 주문 상품이 연관관계의 주인이다.

그러므로 OrderItem.order를 ORDER_ITEM.ORDER_ID외래 키와 매핑한다.

 

주문 상품과 상품: 다대일 단방향 관계이다. OrderItem.item을 ORDER_ITEm.ITEM_ID 외래키와 매핑한다.

 

주문과 배송: 일대일 단방향 관계. Order.delivery를 ORDERS.DELEVERY_ID 외래키와 매핑한다.

 

카테고리와 상품: @ManytoMany를 사용해서 매핑(실무에선 사용x)

 

 

엔티티 클래스 개발

Member 엔티티를 만들어준다.

그다음 address 클래스를 만들어준다.

address 클래스는 값이 변하지않게 만들어주고

다른 클래스들도 만들어준다.

실행시켜본 후 h2 데이터 베이스에 들어가서 제대로 다 구현이 됐는지 확인 해본다.

 

엔티티 설계시 주의점

 

엔티티에는 가급적 setter을 사용하지 말자

setter가 모두 열려있으면 변경 포인트가 너무 많아서 유지 보수가 어렵다.

 

모든 연관관계는 지연로딩(LAZY)으로 설정해야한다.

즉시 로딩(EAGER)은 예측이 어려우며, 어떤 SQL이 실행될지 추적하기 어렵다.

@XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 위 사진처럼 지연로딩으로 설정을 해줘야한다.

 

컬렉션은 필드에서 초기화 하자

 

테이블,컬럼명 생성 전략

스프링 부트에서 기본적으로 SpringPhysicalNamingStrategy를 통하여 지정됨

카멜 케이스 > 언더스코어(memberPoint -> member_point)

.(점) > _(언더스코어)

대문자 > 소문자

 

 

추가 공부

서비스를 보고 직접 해본 erd 설계

아직 미완, 미흡

 

+ Recent posts