Spring/Spring Boot

섹션 2,3. 도메인 분석 설계, 구현 준비 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발]

광터틀 2023. 12. 7. 09:23

이 포스트는 김영한 강사님의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 을 바탕으로 작성되었습니다. 

 

섹션 2. 도메인 분석 설계 

 

순서 

1) 요구사항 분석 

2) 도메인 모델과 테이블 설계 

3) 엔티티 클래스 개발 

4) 엔티티 설계시 주의점 

 

 

1) 요구사항 분석 

화면에 

회원기능 : 회원가입, 회원목록 

상품기능 : 상품등록, 상품목록 

주문기능 : 상품주문, 주문내역 

가 나타나도록 한다. 

 

-> 다음 기능들을 개발한다. 

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

 

 

2) 도메인 모델과 테이블 설계 

2

 

 

회원 엔티티 분석 

 

 

회원 테이블 분석 

 

 

연관관계 매핑 분석 

회원(Member)과 주문(Order)

일대다 양방향 관계. 회원이 주문을 하기 때문에 회원이 주문 리스트를 가지는 것이 맞아보이지만, 객체 세상에서는 그렇지 않다. 실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것이 맞다. 

 

주문(Order)과 배송(Delivery)

일대일 양방향 관계. 

 

주문(Order)과 주문상품(OrderItem)과 상품(Item)

주문과 상품은 다대다 관계. (한 번 주문할 때 여러 상품을 선택할 수 있으므로) 하지만 이런 다대다 관계는 관계형 DB와 엔티티에서 거의 사용하지 않으며 이럴 때는 중간에 주문상품이라는 엔티티를 만들어 주문상품과 주문이 다대일 양방향 관계, 주문상품과 상품이 다대일 양방향관계가 되도록 설계한다. 

 

상품(Item)과 카테고리(Catogory)

다대다 관계로 @ManyToMany 를 이용하여 매핑한다. (실무에서는 사용 X. 참고용 예제로 추가했을 뿐. @ManyToMany는 중간 테이블(CATEGORY_ITEM)에 컬럼을 추가할 수 없고, 세밀하게 쿼리를 실행하기 어렵기 때문에 실무에서 사용하기에 한계가 있음.)  

 

카테고리(Catogory)와 도서, 음반, 영화

도서, 음반, 영화가 상품이라는 공통 속성을 사용하므로 상속 구조로 표현한다. 

 

참고1) 테이블명은 ORDER이 아니라 ORDERS로 사용한다. 데이터베이스가 order by 때문에 예약어로 잡고 있는 경우가 많기 때문. 
참고 2) 외래 키가 있는 곳을 연관관계의 주인으로 정하라. 비즈니스 상 우위에 있다고 주인으로 정하는 것 아님. 

 

 

 

3) 엔티티 클래스 개발 

회원 엔티티 : id, name, address, orders(List) 

주문 엔티티 : id, member, orderItems, delivery, orderDate, status, 메서드 setMember, addOrderItem, setDelivery 

주문상태 : ORDER, CANCEL 

주문상품 엔티티 : id, item, order, orderPrice, count 

상품 엔티티 : id, name, price, stockQuantity, categories(List) 

상품-도서,음반,영화 엔티티 

배송 엔티티 : id, order, address, DeliveryStatus 

배송상태 : READY, COMP 

카테고리 엔티티 : id, name, items(List), Category parent, Category child(List) ????? , 메서드 addChildCategory 

주소 : city, street, zipcode -> 값 타입 (값 타입은 변경 불가능하게 설계해야 한다. @Setter을 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자. JPA 스펙상 엔티티나 임베디드 타입(@Embeddable)은 자바 기본 생성자를 public 또는 protected로 설정해야 하며 protected로 설정하는 것이 더 안전하다. ) 

 

 

4) 엔티티 설계시 주의점 

엔티티에는 가급적 Setter 사용하지 말기 

모든 연관관계는 지연로딩 설정 

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

테이블, 컬럼명 생성 전략 

 



 

섹션 3. 애플리케이션 구현 준비 

 

순서 

1) 구현 요구사항 

2) 애플리케이션 아키텍쳐 

 

 

1) 구현 요구사항 

위 섹션 2에서 기술된 바와 같이 회원기능(회원 등록, 조회), 상품기능(상품 등록, 수정, 조회), 주문기능(상품 주문, 주문내역조회, 주문취소) 를 구현한다. 

 

예제 단순화를 위해 다음 기능들은 구현하지 않는다. 

로그인과 권한 관리X
파라미터 검증과 예외 처리X
상품은 도서만 사용
카테고리는 사용X
배송 정보는 사용X

 

2) 애플리케이션 아키텍쳐

 

 

계층형 구조 사용 

  • controller, web: 웹 계층
  • service: 비즈니스 로직, 트랜잭션 처리
  • repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용
  • domain: 엔티티가 모여 있는 계층, 모든 계층에서 사용 

 

패키지 구조

●  jpabook.jpashop

      ● domain
      ● exception
      ● repository

      ● service
      ● web

 

개발 순서

서비스, 리포지토리 계층을 개발하고, 테스트 케이스를 작성해서 검증, 마지막에 웹 계층 적용