[Spring Boot] TIL - 5 도메인 분석 설계 (실전! 스프링 부트와 JPA 활용1 - 섹션 2 도메인 분석 설계)

하이초·2022년 9월 10일

Spring_Boot

목록 보기
5/11
post-thumbnail

1. 요구사항 분석

🥨 개발에 앞서! 요구사항을 분석하여 해당 요구사항이 다 구현되었는지 확인해야 한다

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

🥨 싱글 타입 전략 등 설계 방법에 대한 공부가 필요..!

🥨 DB에서 다대다를 위해서는 매핑 테이블이 필요하다!
- [A] 1 : many [MAPPING] many : 1[B] 구조로 설계
- @JoinTabel: 매핑테이블 어노테이션
- 실무에서는 ManyToMany 절대 쓰지 말 것!

🥨 연간관계 매핑 분석

  • 단방향, 양방향
  • 연간관계의 주인
    - 외래키를 누가 관리하냐의 문제, 비즈니스상 우위에 있다고 주인으로 정하면 안됨
  • 1:many 관계에서는 many에 FK가 있다!!!

3. 엔티티 클래스 개발

🥨 실무에서는 꼭 필요한 경우에만 setter를 열자!

🥨 엔티티 클래스 개발

  • @Column(name = "member_id"): db 컬럼명을 지정해 주는 것
  • @JoinColumn(name = "meber_id"): FK를 알려주는..
  • @Embedded, @Embeddable: 내장 타입이라는 것을 알려주기 위한 것

이렇게 설정을 해도 db에서 직접 확인하고 변경할 것!

🥨 객체는 변경 포인트가 두개인데 FK는 하나일 때!

  • 하나를 주인이라는 개념으로 잡으면 됨
  • FK가 가까운 곳을 주인으로
  • @OneToMany(mappedBy = "member"): 주인이 아닌 쪽 저쪽이 변경되면 ㅇㅇ
  • @ManyToOne, @JoinColumn(name = "parent"): 주인인 쪽

🥨 상속 관계 매핑

  • @Inheritance
    - single_table: 하나에 다 때려박는
    - table_per_class: 한 클래스에 한 테이블
    - joined: 가장 정규화 된 스타일
  • @DiscriminatorColumn(name = "dtype"): single_table의 경우 뭔지 알려주기 위한 구분값

🥨 ENUM

  • @Enumerated(EnumType.-): ORDINAL, String
  • ORDINAL - 중간에 상태가 생기면 망해~! 가급적 String으로 쓰자

🥨 값 타입은 변경 불가능하게 설계

  • Setter를 제거하고, Embeddable은 자바 기본 생성자를 public 또는 protected로 설정해야 하고, public 보다는 protected로 하는 것이 좋다(jpa가 리플렉션 같은 기술을 사용할 수 있도록)

4. 엔티티 클래스 주의사항

🥨 Setter는 되도록 다 닫아주자

🥨 모든 연관관계는 지연로딩으로!

  • 즉시로딩: EAGER, N + 1 문제
  • 지연로딩: LAZY
  • XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 지연로딩으로 직접 설정해야 함
  • 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프를 사용할 것!

🥨 DB 테이블명

  • namingStrategy를 통해 쉽게 관리할 수 있다

🥨 cascade

  • Collection 안에 있는 세부 데이터들도 넣어주기 때문에 내가 별도로 넣어 줄 필요가 없다
profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글