Spring, java/Spring_Project

[Spring Project] 엔티티 설계 주의사항

재코딩 2022. 8. 22. 15:34
반응형

목차

  • Setter를 가급적 사용하지 말자
  • 즉시로딩 vs 지연로딩
  • 컬렉션 필드는 초기화를 시켜라
  • 테이블명, 컬럼명 규칙

 

1. Setter를 가급적 사용하지 말자

  • 실무에서는 Setter를 너무 많이 사용하게되면, 변경 포인트가 너무 많기 때문에 유지 보수가 어렵다. 엔티티 수정이 어떻게 되는지 파악하기가 어렵다. (나중에 변경해어야될때, 모든 엔티티를 보면서 유지보수를 해야하기 때문에 Setter을 줄어야한다)-> Getter는 열고 Setter는 닫아야한다.

2. 즉시로딩 vs 지연로딩

  • 즉시로딩('EAGER')

 

위 상황에서 member를 조회할 때, 연관된 order를 한번에 조회한다. 그리고 order를 조회할때, 필요한 것을 모두 조회한다는 것이다.

이 경우에 어떤 attribute를 조회할 때, 연관된 객체들을 모두 조회하기 때문에, 최악의 경우에 하나를 조회할 경우 모든 SQL을 조회하기때문에 연관된 데이터베이스를 모두 가져오기때문에 실무에서는 가급적 사용하지 않는 것이 중요하다.

특히, JPQL을 실행할 때, N+1 문제가 자주 발생한다.

  • 지연로딩('LAZY')

실무에서는 모든 연관관계는 지연('LAZY')로딩을 사용해야한다. 지연로딩을 사용하다가 한방의 쿼리가 필요할 경우에는 "FETCH JOIN" 또는 엔티티 그래프를 이용해야한다.

 

-. ManyToOne, OneToOne: 즉시로딩 -> fetch type을 모두 LAZY로 변경해야한다.

-. OneToMany, ManyToMany: 기본이 LAZY이다.

두가지의 타입이 다르다! 그렇기때문에 XToOne의 fetch를 LAZY로 변경 !

 

3. 컬렉션 필드는 초기화를 시켜라

-. 컬렉션은 필드를 초기화 시키는 것이 안전하다. (Null문제에서 안전하다)

-. hibernate가 엔티티를 persist하는 순간 내장 컬렉션으로 변경이 된다. 그렇게되면 hibernate 내부 메커니즘에 문제가 생기기때문에 필드에서 생성하는 것이 가장 안전하고 간결한 코드가 된다.

ex code)

Member member = new Member();
  System.out.println(member.getOrders().getClass());
  em.persist(team);
  System.out.println(member.getOrders().getClass());
//출력 결과
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag

 

4. 테이블명, 컬럼명 규칙

  • 카멜 케이스 -> 언더스코어(memberPoint member_point) 
  • .(점) -> _(언더스코어)
  • 대문자 -> 소문자

 

 

논리명 spring.jpa.hibernate.naming.implicit-strategy 와 물리명 spring.jpa.hibernate.naming.physical-strategy에서 변경을 할 수 있으니 참고를 하시면 좋을 것 같습니다.

 

반응형