본문 바로가기
기타 CS

(JPA) Entity 설계 시 주의점

by 밝지 2023. 3. 18.
728x90
반응형

JPA에서 Entity 설계 시 유의할 점

  • 1 : N 관계에서는 N에 해당되는 엔티티에 FK가 있어야 한다. (회원-주문의 관계라면 주문이 회원이 FK를 가진다.)
  • 1 : 1 관계에서는 둘 중 어디든 FK를 둘 수 있지만 이왕이면 더 많이 조회하는 엔티티에 둔다.
  • N : N 관계(@ManyToMany)는 만들지 않는다. N : N인 경우 매핑 테이블이 필요한데 이 테이블에는 등록일, 수정일 같은 필드를 두기가 어려워 운영에 좋지 않다.
  • 값 타입(임베디드 타입)은 변경하면 안된다. 생성시에만 값을 주고 변경 불가능하도록 해야 한다. 값 타입에는 @Embeddable, 사용 필드에는 @Embedded 를 달아준다.
  • 엔티티는 가급적 변경 불가능하게 설계한다. (Setter 사용 금지. 생성자를 통해서만 생기도록. default 생성자는 protected 로 만들어 안전하게)
  • 모든 연관 관계의 FetchType은 LazyLoading 으로 설정한다. (EAGER 즉시 로딩은 예측이 어렵고 어떤 SQL이 실행될지 추적이 어렵다. em.find 를 통해 하나만 조회하는 경우 큰 문제가 없겠지만, JPQL로 가져올 경우 fetchType이 EAGER로 지정되면 쿼리가 1개가 날아가는 것이 아니고 N+1 가 날아갈 수 있다. FK 조회해와야 하니까...!)
  • @XToOne(OneToOne, MayToOne)의 경우 EAGER가 default 이므로 직접 LAZY로 설정해줘야 한다.
  • 연관관계에 필요한 entity를 한 번에 가져와야 한다면 FETCH JOIN을 사용하자. (fetchType = EAGER 는 고려하지 말것)
  • Collection은 필드에서 초기화한다. NPE 걱정이 없고, 생성자에서 초기화하는 경우 hibernate가 collection의 변경 사항을 제대로 추적하지 못할 수 있다. (생성자, setter XXXXXX)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형