본문 바로가기
Spring with 김영한

Entity 설계시 주의점

by wonseok99 2021. 8. 18.

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

  • Setter가 모두 열려있게 된다면, 변경 포인트가 많아져 유지보수가 어렵다!



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

  • 즉시로딩(EAGER) 은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 
  • 실무에서 모든 연관관계는 지연로딩(LAZY) 으로 설정해야 한다.
  • 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.
  • @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다.



3. 컬렉션은 필드에서 초기화 하자.

[ private List<Order> orders = new ArrayList<>(); ]

  • null 문제에서 안전하다.
  • 하이버네이트는 엔티티를 영속화 할 때, 컬랙션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다.
    만약 getOrders() 처럼 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생한다.
    따라서 필드레벨에서 생사하는게 가장 안전하고, 코드도 간결하다.



4. 테이블, 컬럼명 생성 전략 [ 스프링 부트에서 하이버네이트 기본 매핑 전략을 변경해, 실제 테이블 필드명은 다르다 ]

  • 하이버네이트 기존 구현 : 엔티티의 필드명을 그대로 테이블의 컬럼명으로 사용
    (SpringPhysicalNamingStrategy)
  • 스프링 부트 신규 설정 ( 엔티티(필드) -> 테이블( 컬럼 ))
    1. 카멜 케이스  ➔  언더스코어 ( memberPoint -> member_point )
    2. .(점)  ➔  _(언더스코어)
    3. 대문자  ➔  소문자