연관 관계
외래 키가 있는 곳을 연관관계의 주인으로 정해라.
엔티티 클래스 개발1
엔티티의 식별자 id를 사용하고 pk칼럼명을 member_id로 사용했다. id라고 작성해도 되지만 테이블의 타입을 구분하기 위해
테이블명 + id를 사용하였다.
@Embeddable, @Embedded
중복되는 column들을 객체로 해결한다.
@Embeddable
하나로 표현하고자 하는 개념에 해당하는 클래스를 생성한 뒤 클래스 상단에 @Embeddable을 입력한다.
@Embedded
객체 필드를 생성하고, 필드 바로위에 @Embedded 어노테이션을 부여하면 된다.
@Enumerated
EnumType을 사용할 때 쓰는 어노테이션이다.
꼭 @Enumerated(EnumType.STRING)을 사용하도록 하자
default값이 @Enumerated(EnumType.ORDINAL)인데 이건 enum 순서 값을 db에 저장하기 때문에 만약 enum 타입이 변경된다면 예기치 못한 문제가 발생할 수 있다.
그래서 EnumType.STRING을 사용하도록 하자
@Inheritance
상속관계 매핑 전략이다.
default는 SINGLE_TABLE(단일 테이블 전략)이다.
1) JOINED
JOINED 방식은 부모 테이블을 생성하여 자식 테이블의 PK를 외래키로 갖는 방식이다.
2) SINGLE_TABLE
자식테이블의 속성을 부모테이블의 속성으로 합치는 방식
3) TABLE_PER_CLASS
절대 사용하지 말라고한다.
DiscriminatorColumn(name = "DTYPE"), DiscriminatorValue("XXX")
DiscriminatorColumn을 부모클래스에 선언한 후 하위 클래스를 구분하는 용도의 컬럼이다. default는 DTYPE이다.
DiscriminatorValue는 하위 클래스에 선언하고 엔티티를 저장할 때 칼럼을 구분할 때 사용한다.
엔티티 클래스 개발2
값 타입은 변경 불가능하게 설계해야한다.
즉 생성자에서 값을 모두 초기화해서 변경 분가능한 클래스로 만들어야한다.
JPA 스펙상 엔티티나 임베디드 타입(@Embeddable)은 자바 기본 생성자를 public 또는 protected로 설정해야한다.
JPA가 이런 제약을 두는 이유는 리플랙션(https://kingname.tistory.com/164) 같은 기술을 사용할 수 있도록 지원해야하기 때문이다.
엔티티 설계시 주의점
모든 연관관계는 지연로딩으로 설정해야한다.
EAGER로 하는순간 N+1문제가 발생할 수 있고 예측이 어렵다. 그래서 모든 연관관계는 지연로딩(LAZY)로 설정해야 한다.
@XToOne만 LAZY로 설정하면 된다. 다른 것들은 기본적으로 LAZY로 되어있다.
컬렉션은 필드에서 초기화 하자.
컬렉션은 필드에서 바로 초기화 해야 안전하다.
NULL문제에서 안전하고 코드도 간결하기 때문이다.
양방향 연관관계에서의 값을 초기화 해주는 과정은 좀 더 공부가 필요한 것 같다.
'백엔드 > 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 카테고리의 다른 글
실전! 스프링 부트와 JPA 활용1 - 상품, 주문 도메인 개발 (0) | 2023.01.18 |
---|---|
실전! 스프링 부트와 JPA 활용1 - 웹 계층 개발 (0) | 2023.01.08 |
실전! 스프링 부트와 JPA 활용1 - 회원 도메인 개발 (0) | 2023.01.03 |