JPA) entity 설계시 주의점

박우영·2023년 3월 24일
0

자바/코틀린/스프링

목록 보기
17/35

1. entity 에는 가급적 Setter 사용 하지 않기.

  • Setter가 모두 열려있으면 어디서 변경 되었는지 추적하기 힘들기때문에 유지보수가 어렵다.

2. 모든 연관관계는 지연로딩으로 설정하기.

먼저 지연로딩, 즉시로딩 을 알아보기전에 프록시에 대해 알아보자.

프록시(Proxy)란?

쉽게 말하면 가짜 엔티티이다.

엔티티를 실제 사용하는 시점까지 DB 조회를 미루고싶을때 사용한다.

사용 방법

  • EntityManager.getReference() 메소드를 사용하면 프록시객체를 호출한다.
  • 이 메소드를 호출하면, 실제 엔티티 객체를 만들지 않고 + DB에 조회하지 않는다.

특징

  • 실제 엔티티 클래스를 상속받는다.
  • 실제 클래스와 겉모양이 같다.
  • 프록시 객체는 실제 객체의 참조(target)을 보관한다.
  • 프록시 객체를 호출하면 실제 객체의 메소드를 호출한다.

즉시로딩과 지연로딩

지연로딩(LAZY)

  • 필요한 엔티티만 조회한다. (DB에서)
  • 실무에서는 지연로딩을 지향해야한다.
  • @OneToMany, @ManyToMany 은 지연로딩을 기본 전략으로 사용한다.

즉시로딩(EAGER)

  • 어떤 한 엔티티를 조회할때, 그와 연관된 모든 엔티티를 다 조회한다.
  • 단점: 필요이상으로 모든 엔티티를 조회하기 때문에 성능이 저하될 수도 있고, 어떻게 join되는지 자세히 알 수 없기때문에 즉시로딩을 사용하는 것은 매우 위험하다.
  • @ManyToOne , @OneToOne 은 즉시로딩을 기본 전략으로 사용하고 있기 때문에 지연로딩을 명시해줘야한다.
    사용 방법: @ManyToOne(fetch = FetchType.LAZY)

따라서 지연로딩으로 설정하여 설정하는 것이 추적하기 유리하기때문에 지연로딩으로 설정하기!

0개의 댓글