JPA - 엔티티 설계시 주의점

2020. 11. 2. 12:39개인공부/JPA

엔티티 설계시 주의점

 

1.엔티티에는 가급적 Setter를 사용하지 말자.

  • Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다.

 

2. 모든 연관관계는 지연로딩으로 설정

  • 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1문제가 발생한다. //  즉시로딩 -> 멤버를 조회할때 연관된 오더를 한번에 다 조회하는것.
  • 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
  • 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.
  • @XToOne(OneToOne, ManyToOne)관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다. (기본 fectch가 EAGER. 하지만 OneToMany는 LAZY)

 

fetch = FetchType.EAGER로 설정하면

JPQL select o From order o; -> SQL select * from order 로 쌩 SQL로 인식한다.

Order를 100번 조회하면 쿼리가 100개 나가게 된다.

 

3. 컬렉션은 필드에서 초기화 하자.

  • 컬렉션은 필드에서 바로 초기화 하는 것이 안전하다.
  • null 문제에서 안전하다.
  • 하이버네이트는 엔티티를 영속화 할 때, 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다.
  • 만약 getOrders() 처럼 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 매커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는 것이 가장 안전하고, 코드도 간결하다.

 

 

 

 

 

 

 

 

출저 - 인프런 / JPA 실전1 / 김영한님

'개인공부 > JPA' 카테고리의 다른 글

JPA - 변경 감지와 병합 (merge)  (0) 2020.11.05
JPA - API를 만들때는  (0) 2020.11.05
JPA - 도메인작성  (0) 2020.10.30