도메인 설계

Jaca·2021년 9월 1일
0

내용을 조금 들으니, 앞선 이론강의들에서 썼던 예제들을 그대로 실무로 적용한다.
그래서 강의를 듣기전 혼자 코딩을 해보고 들으며 놓쳤던 점 등을 잡는 쪽으로 하자.

계층형 구조 사용

  • Controller, web : 웹 계층

  • Service : 비즈니스 로직, 트랜잭션 처리

  • Repository : JPA를 직접 사용하는 계층, 엔티티 매니저 사용

  • Domain : 엔티티가 모여있는 계층, 모든 계층에서 사용

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

요구 사항 분석

도메인 모델과 테이블 설계

특이사항

  • 주문과 상품은 다대다 관계다. 하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티 티에서도 거의 사용하지 않는다. 따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대 다, 다대일 관계로 풀어냈다.

  • 상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다.

회원 엔티티 분석

특이사항

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

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

회원 테이블 분석

특이사항

  • 회원 엔티티의 Address 임베디드 타입 정보가 회원 테이블에 그대로 들어갔다. 이것은 DELIVERY 테이블도 마찬가지다.

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

  • 테이블명이 ORDER 가 아니라 ORDERS 인 것은 데이터베이스가 order by 때문에 예약어로 잡고 있는 경우가 많다. 그래서 관례상 ORDERS 를 많이 사용한다.

엔티티 클래스

Member

Order

Delivery

OrderItem

Item

Album, Book, Movie

동일 구조로 Album 이하 생략

Category

다대다 조인은 조인 테이블이 만들어진다.
하지만 이 생성된 조인 테이블의 속성의 유연성이 현저히 떨어져 실무에선 쓰기 힘들다.
수업을 위해 만든 것.

Address

값 타입은 변경 불가능하게 설계해야 한다.
그래서 Setter를 만들지 않고, 생성자를 통한 초기화를 해야 한다.
JPA 스펙상 엔티티나 임베디드 타입 @Embeddable 은 자바 기본 생성자(default constructor)를 public 또는 protected 로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전 하다.

신경 쓰자

  • @Column :
    DB에 올라갈 속성의 이름을 설정해준다. 주로 Id 속성에 많이 사용 되었는데, Id 속성은 많은 엔티티에 중복되어 선언되어 있으므로, 직관적으로 알아볼 수 있게 이름을 지정해준다.

  • @JoinColumn : 어느 테이블에 조인하는지 알려줘야 한다. 내가 조인할 테이블의 PK 속성을 지정해준다. 주로 연관관계의 주인에게 알려주며, 반대쪽은 자연스럽게 mappedby 속성으로 매핑된다.

  • fetch : @xxxToOne 조인은 fetchType.LAZY로 지정할 것.

  • Enum : Enum을 사용할 때는 EnumType.STRING 사용

  • 1:1 조인에서의 주인 : 1:1 조인에서는 외래키를 어디에 둘 것인지, 고민을 해야한다. 어디에 두든 장단점이 있으나, 일반적으로 자주 액세스가 될 쪽으로 잡는 것이 이득인 경우가 많다.

  • 컬렉션은 필드에서 초기화 : 하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 만약 getOrders() 처럼 임의의 메서드에서 컬력션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는 것이 가장 안전하고, 코드도 간결하다.

  • Setter : Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거, 위 내용은 수업이기 때문에 일부로 모두 Setter를 열어 둔 것!

profile
I am me

0개의 댓글