엔티티 설계시 주의사항

컴공생의 코딩 일기·2023년 1월 8일
0

JPA

목록 보기
3/14
post-thumbnail

엔티티 설계시 주의사항

이 글은 김영한님의 실전! 스프링 부트와 JPA 활용1 강의를 듣고 정리된 글을 제 블로그에 옮긴 글입니다.

  • 엔티티는 가급적 Setter를 사용하지 말자

    • setter의 단점

      1. Setter는 사용 의도를 알기 어렵다

      2. 값이 쉽게 변경 될 수 있다.

      3. immutable 하지 못하다.

      4. 유지보수가 어렵다.

  • 모든 연관관계는 지연로딩으로 설정 하자

    • 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N + 1 문제가 자주 발생한다.
    • 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
    • 연관된 엔티티를 함께 DB에서 조회해야 한다면, fetch join 또는 엔티티 그래프 기능을 사용해야 한다.
    • @XtoOne( OneToOne, ManyToOne ) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다. 예) xxToOne( fetch = FetchType.LAZY )
  • 컬렉션은 필드에서 초기화 하자.

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

0개의 댓글