인프런 김영한 선생님 < 스프링 부트와 JPA 활용 1 강의 > 를 보고 정리한 내용입니다.
📍 엔티티에는 가급적 Setter를 사용하지 말자
Setter를 열어두면 변경 포인트가 너무 많아져 유지보수가 어렵다.
📍 모든 연관관계는 지연로딩으로 설정하자
- 즉시로딩(EAGER)은 예측이 어렵고 어떤 SQL이 실행될지 추적하기 어렵다.
- 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. (뜬금없는 의견이지만 N+1보단 1+N이 맞는 것 같다.)
- 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
- 연관된 엔티티를 함께 조회해야 한다면, fetch join 또는 엔티티 그래프 기능을 사용한다.
- OneToOne, ManyToOne 관계는 디폴트값이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다.
📍 컬렉션은 필드에서 초기화하자
하이버네이트는 엔티티를 영속화할 때, 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다.
Member member = new Member();
System.out.println(member.getOrders().getClass());
em.persist(member);
System.out.println(member.getOrders().getClass());
//출력 결과
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag
만약 getOrders()처럼 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 때문에 필드레벨에서 생성하는 것이 가장 안전하고 간결하다. (null 문제로부터 안전성도 보장)
'Dev > Spring' 카테고리의 다른 글
[Spring] 관심사를 분리하는 이유 (0) | 2024.05.12 |
---|---|
[Junit] id to load is required for loading 해결 방법 (1) | 2023.09.21 |
[H2] zsh: permission denied: ./h2.sh (0) | 2023.09.18 |
[Spring] BeanFactory와 ApplicationContext 차이점 (0) | 2023.09.15 |
[Spring] 생성자 주입을 선택해야 하는 이유 (0) | 2023.09.14 |