이 글은 김영한 님의 실전! 스프링 부트와 JPA 활용-1 강의를 참고하여 작성한 글입니다.
Setter가 열려있으면, 데이터가 변경될 수 있는 지점이 너무 많아서 유지보수가 어려워진다.
FetchType.Lazy
)으로 설정하자FetchType.EAGER
)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. N+1
문제가 자주 발생한다.FetchType.Lazy
를 한다고 N+1
문제가 발생하지 않는 것은 아니다. 참조FetchType.LAZY
)은 연관관계에 있는 객체를 프록시 객체로 바인딩하여 실제로 해당 객체가 직접 호출된 시점에 쿼리를 실행하는 장점이 있다.OneToOne
, ManyToOne
관계는 기본값이 즉시로딩이므로, 지연로딩으로 변경해주자.Entity
가 View
나 Controller
와 같은 세션의 영역에서 수정될 때, LazyInitializationException
이 발생하기도 한다. 이 경우, OSIV
를 적용하여 해결할 수 있다. 참조NullPointerException
을 막을 수 있다. (안전하다)Entity
에서 persist()
메서드를 호출하면, 컬렉션을 감싸서, 자체적으로 제공하는 내장 컬렉션(PersistentBag
)으로 변경하여 저장한다. 만약, Setter 메서드로 컬렉션 필드를 강제로 수정하면 Hibernate 내부 메커니즘에 장애를 발생시킬 수 있다.