[Spring] Entity 설계 시 주의사항

bluewhale·2021년 5월 23일
0

Spring

목록 보기
5/9

이 글은 김영한 님의 실전! 스프링 부트와 JPA 활용-1 강의를 참고하여 작성한 글입니다.

Entity 설계시 주의점

Entity에는 가급적 Setter를 사용하지 말자

Setter가 열려있으면, 데이터가 변경될 수 있는 지점이 너무 많아서 유지보수가 어려워진다.

연관관계는 지연로딩(FetchType.Lazy)으로 설정하자

  • 즉시로딩(FetchType.EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다.
  • 특히 JPQL을 실행할 때, N+1 문제가 자주 발생한다.
    그러나, FetchType.Lazy를 한다고 N+1 문제가 발생하지 않는 것은 아니다. 참조
  • 지연로딩(FetchType.LAZY)은 연관관계에 있는 객체를 프록시 객체로 바인딩하여 실제로 해당 객체가 직접 호출된 시점에 쿼리를 실행하는 장점이 있다.
  • OneToOne, ManyToOne 관계는 기본값이 즉시로딩이므로, 지연로딩으로 변경해주자.
  • 지연로딩으로 인해 영속 상태에 있는 EntityViewController와 같은 세션의 영역에서 수정될 때, LazyInitializationException이 발생하기도 한다. 이 경우, OSIV를 적용하여 해결할 수 있다. 참조

컬렉션인 필드에서 초기화하자

  • NullPointerException을 막을 수 있다. (안전하다)
  • Hibernate는 Entity에서 persist() 메서드를 호출하면, 컬렉션을 감싸서, 자체적으로 제공하는 내장 컬렉션(PersistentBag)으로 변경하여 저장한다. 만약, Setter 메서드로 컬렉션 필드를 강제로 수정하면 Hibernate 내부 메커니즘에 장애를 발생시킬 수 있다.

References

실전! 스프링 부트와 JPA 활용-1
N+1 문제
OSIV

profile
안녕하세요

0개의 댓글