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 안에 있는 세부 데이터들도 넣어주기 때문에 내가 별도로 넣어 줄 필요가 없다