코딩과 결혼합니다

[JPA] 엔티티 설계시 주의점 본문

2세/JPA

[JPA] 엔티티 설계시 주의점

코딩러버 2024. 2. 13. 22:35
728x90

엔티티에는 가급적 Setter를 사용하지 않는다.

  1. 캡슐화와 정보 은닉 - 세터를 제공하면 외부에서 엔티티의 상태를 직접 변경할 수 있다.
  2. 불변성 유지 - 상태를 변경할 수 있기 때문에 불변성을 유지하기 어렵다.
  3. 부작용 최소화 - 세터는 상태 변경 외에도 다른 동작을 수행할 수 있다. 이는 예기치 않은 부작용을 초래할 수 있으며, 코드의 복잡성을 증가시킬 수 있다.

세터를 대체하는 방법

일반적으로는 생성자를 통해 초기 상태를 설정하고, 필요에 따라 내부 메서드를 사용하여 상태를 변경할 수 있다.

 

모든 연관관계는 지연로딩으로 설정한다.

즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.

연관된 엔티티를 함께 DB에서 조회해야 한다면, fetch join, 또는 엔티티 그래프 기능을 사용한다.

@XToOne 관계를 기본이 즉시로딩이므로 직접 지연로딩으로 설정한다.

 

즉시로딩을 사용하면 생기는 문제들

  1. 성능 저하 - 연관된 모든 데이터를 한 번에 가져오기 때문에, 필요하지 않은 데이터까지 불필요하게 로딩될 수 있다.
  2. 메모리 부담 - 연관된 모든 데이터를 메모리에 로딩하기 때문에 부담이 커질 수 있다.

컬렉션은 필드에서 초기화한다.

  1. NullPointerExeption 방지 : 필드를 선언할 때 컬렉션을 초기화하지 않으면, 해당 필드는 기본적으로 null로 설정된다. 나중에 해당 필드를 사용하는 곳에서 null 체크를 하지 않고 초기화하면 에러가 발생할 수 있다.
  2. 안정성과 편의성 : 해당 필드를 사용하는 코드에서 항상 컬렉션 객체를 사용할 수 있다. 
  3. 하이버네이트는 엔티티를 영속화할 때, 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 만약 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다.