1. entity 에는 가급적 Setter 사용 하지 않기.
- Setter가 모두 열려있으면 어디서 변경 되었는지 추적하기 힘들기때문에 유지보수가 어렵다.
2. 모든 연관관계는 지연로딩으로 설정하기.
먼저 지연로딩, 즉시로딩 을 알아보기전에 프록시에 대해 알아보자.
프록시(Proxy)란?
쉽게 말하면 가짜 엔티티이다.
엔티티를 실제 사용하는 시점까지 DB 조회를 미루고싶을때 사용한다.
사용 방법
- EntityManager.getReference() 메소드를 사용하면 프록시객체를 호출한다.
- 이 메소드를 호출하면, 실제 엔티티 객체를 만들지 않고 + DB에 조회하지 않는다.
특징
- 실제 엔티티 클래스를 상속받는다.
- 실제 클래스와 겉모양이 같다.
- 프록시 객체는 실제 객체의 참조(target)을 보관한다.
- 프록시 객체를 호출하면 실제 객체의 메소드를 호출한다.
즉시로딩과 지연로딩
지연로딩(LAZY)
- 필요한 엔티티만 조회한다. (DB에서)
- 실무에서는 지연로딩을 지향해야한다.
- @OneToMany, @ManyToMany 은 지연로딩을 기본 전략으로 사용한다.
즉시로딩(EAGER)
- 어떤 한 엔티티를 조회할때, 그와 연관된 모든 엔티티를 다 조회한다.
- 단점: 필요이상으로 모든 엔티티를 조회하기 때문에 성능이 저하될 수도 있고, 어떻게 join되는지 자세히 알 수 없기때문에 즉시로딩을 사용하는 것은 매우 위험하다.
- @ManyToOne , @OneToOne 은 즉시로딩을 기본 전략으로 사용하고 있기 때문에 지연로딩을 명시해줘야한다.
사용 방법: @ManyToOne(fetch = FetchType.LAZY)
따라서 지연로딩으로 설정하여 설정하는 것이 추적하기 유리하기때문에 지연로딩으로 설정하기!