Getter 모두 열고

Setter 사용X 변경 추적이 어렵다. 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공

 

엔티티의 식별자는 id 사용 PK 컬럼명은 member_id

엔티티는 타입이 있으므로 id만으로 구분 가능

테이블은 타입이 없으므로 구분이 어렵다.

테이블은 테이블 + id

 

실무에서는 @ManyToMany 사용X

중간 테이블에 컬럼을 추가할 수 없고 세밀하게 쿼리 실행이 어려움

중간 엔티티를 만들고 @ManyToOne @OneToMany로 매핑해서 사용

다대다 매핑 -> 일대다 + 다대일

 

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

@Setter 제거하고 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스로 만들어야함

JPA 스펙상 엔티티나 임베디드 타입 (@Embeddable) 은 자바 기본 생성자를 public protected로 설정해야 함

public보다는 protected가 안전

(JPA 구현 라이브러리가 객체를 생성할 때 리플렉션 같은 기술을 사용할 수 있도록 지원하기 위한 제약)

 

모든 연관관계는 지연로딩(LAZY)으로 설정

즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어려움

JPQL 실행할 때 N+1 문제가 자주 발생

연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용

@XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야함

 

컬렉션은 필드에서 초기화

null 문제에 안전함

 

스프링 부트 신규 설정

엔티티(필드) 테이블(컬럼)
카멜 케이스 memberId 언더스코어 member_id
언더스코어
대문자 소문자

 

cascade = CascadeType.ALL (ALL은 delete까지 모두)

persist(orderItemA)

persist(orderItemB)

persist(order)

= > persist(order)

 

연관관계 메서드 작성

 

 

 

+ Recent posts