본문 바로가기
개발/Spring

[JPA] 도메인 분석 설계 및 아키텍처

by 윤호 2021. 9. 6.

도메인 분석 설계

설계

  • 1:N에서 N이 주인. 외래키가 있는 곳을 주인으로

엔티티 클래스 개발

  • 연관관계 주인이 아닌 경우 @OneToMany(mappedBy = "member")
  • 상속 엔티티
    • 상속 관계에서 상속 table type 전략을 정해줘야함.
      • @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
      • 자식들을 하나의 테이블에 생성
    • @DiscriminatorColumn(name = "dtype") @DiscriminatorValue("A")
  • Enum
    • @Enumerated(EnumType.String)
  • 1대1 관계에서 주인? - 주인을 어디에 둬도 상관 없음
    • tip) access를 많이 하는 곳에 두자.
  • N대N 관계 - 실무에선 X
    • JoinColumn이 아닌 JoinTable 사용
    • 중간 테이블이 필요함.

엔티티 설계 주의점

  • (중요)모든 연관관계는 지연 로딩(LAZY) 설정
    • 즉시로딩은 한번에 연관된 디비를 다 가져옴.
      • 100번 조회하면 100번 다 한 번씩 가져옴
    • 즉시로딩(EAGER) 은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어려움
    • fetch = LAZY로 하자.
    • 연관된 엔티티를 함께 디비에서 조회해야 한다면 fetch join 을 사용하자. 또는 엔티티 그래프
    • ToMany는 기본이 LAZY, but **ToOne은 기본이 EAGER**여서 LAZY로 바꿔줘야함!
  • 컬렉션은 필드에서 초기화하고 건들지 말자. (hibernate 관련)
    • List<> li = new ArrayList<>();
  • casecade
    • persist를 하나만하면 다됨.
  • 연관관계 편의 메소드
    • 양방향 관계에서 서로 지정을 해줘야하므로 메서드를 이용하자.
    • 핵심적으로 컨트롤 하는 곳에 메서드를 만들자. (Order에다가)
    • //== 연관관계 메서드 ==//
      public void setMember(Member member){
      this.member = member;
      member.getOrders().add(this);
      }

애플리케이션 아키텍처

패키지 구조

  • domain
  • exception
  • repository
  • service
  • web

개발 순서: 엔티티 -> 리포지토리 -> 서비스

댓글