도메인 분석 설계

inho ha·2022년 4월 26일
0

요구사항 분석

  1. 회원 기능
    회원 등록
    회원 조회

  2. 상품 기능
    상품 등록
    상품 수정
    상품 조회

  3. 주문 기능
    상품 주문
    주문 내역 조회
    주문 취소

  4. 기타 요구사항
    상품은 제고 관리가 필요
    상품의 종류는 도서, 음반 영화
    상품을 카테고리로 구분 가능
    상품 주문시 배송 정보를 입력할 수 있다.

도메인 모델

회원-주문-상품 관계 : 회원은 여러 상품을 주문 가능, 한 번 주문할 때 여러 상품 선택 가능

회원 엔티티 분석

jpa 에서 @manytomany 사용하지 않기

@onetomany,@manytoone 으로 풀어내기

연관관계 매핑 분석

회원과 주문 : 주문에서 fk 를 가짐, 일대다 에서는 다가 fk를 가짐

주문과 아이템 : 아

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

엔티티 클래스 개발

실무에서는 가급적 Getter는 열어두고 Setter는 꼭 필요한 경우에만 사용

@OneToOne 같은 경우에는 fk를 어디에 둬도 상관 없음
자주 access 하는 곳에 두면 좋음

ManyToMany 쓰면 가능은 하지만 필드를 더 추가하고 그런것이 안됨
등록한 날짜나 그런거 추가해주는 것이 안됨

@Setter 대신 생성자에서 초기화 해주는 것이 좋음
JPA 스펙상 자바 기본 생성자를 protected로 만들어 줘야함 (public 도 가능하지만 다른곳에서 호출 막 못하도록 하기 위함)

엔티티 설계시 주의점

  1. 엔티티에서는 앵간하면 Setter 사용 금지
    Setter가 열려있으면 변경포인트가 많아서 유지 보수가 어렵다

  2. 모든 연관관계는 지연로딩으로 설정
    즉시로딩(EAGER)(조회시 연관된 엔티티 다 가져오는 것)은 예측이 여렵고 어떤 SQL이 실행될지 추적하기 어려움
    특히 JPQL(jpa가 제공하는 쿼리)을 실행할때 N+1문제가 자주 발생함
    연관된 엔티티를 함께 DB에서 조회해야하면 fetch join 또는 엔티티 그래프 기능을 사용
    @OneToOne, @ManyToOne 은 디폴트 값이 EAGER이므로 따로 (fetch = FetchType.LAZY) 로 설정해줘야 한다.

  3. 컬렉션은 필드에서 초기화
    컬렉션은 필드에서 바로 초기화 하는 것이 안전하다
    null문제에서 안전하고
    하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 따라서 필드가 아닌 생성자나 다른 메서드에서 초기화를 하게 되면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다.

  4. 테이블, 컬럼명 생성 전략
    기존의 하이버네이트에서는 기본적으로 엔티티의 필드명을 그대로 테이블 명으로 사용했음
    스프링 부트 신규 설정은 자바의 카멜케이스를 스네이크케이스로 바꾸고 .을 _으로 대문자는 소문자로 바꾼다

profile
iha / ian / inho ha

0개의 댓글