엔티티에는 가급적 Setter를 사용하지 말자.
- Setter가 모두 열려 있다면, 변경 포인트가 많아 유지보수가 어렵다.
⭐ 모든 연관관계는 반드시 지연로딩으로 설정해라.
- 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기가 어렵다.
- 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.
- 따라서 실무에서는 모든 연관관계를 지연로딩(LAZY)으로 설정해야 한다.
- 연관된 엔티티를 함께 DB에서 조회해야 한다면, fetch join 또는 엔티티 그래프 기능을 사용한다.
- @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해줘야 한다. (@XToMany 관계는 기본이 지연로딩이므로 설정해줄 필요 없음)
@ManyToOne(fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
컬렉션은 필드에서 초기화하자.
- 컬렉션은 필드에서 바로 초기화하는 것이 안전하다.
- null 문제에 있어 안전하다.
- 하이버네이트는 엔티티를 영속화 할 때, 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경한다.
만약 getOrders()처럼 임의의 메소드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 따라서 필드레벨에서 생성하는 것이 가장 안전하고 코드도 간결하다.
테이블, 컬럼명 생성 전략
- 스프링 부트에서 하이버네이트 기본 매핑 전략을 변경해서 실제 테이블 필드명은 다르다.
- 하이버네이트 기존 구현
- 엔티티의 필드명을 그대로 테이블 명으로 사용 → SpringPhysicalNamingStrategy
- 스프링 부트 신규 설정 (엔티티(필드) → 테이블(칼럼))
- 카멜 케이스(memberPoint) → 언더스코어 (member_point)
- .(점) → _(언더스코어)
- 대문자 → 소문자
테이블, 컬럼명 생성 전략에 대해 더 알아보고 싶다면 다음을 참고하자.
https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#howto-configure-hibernate-naming-strategy
https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#naming
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑(1) : 단방향 매핑 (0) | 2022.10.06 |
---|---|
[JPA] 데이터베이스 스키마 자동 생성 : DDL AUTO (0) | 2022.09.30 |
[JPA] 엔티티 매핑(2) - 기본 키 매핑 전략 (1) | 2022.09.30 |
[JPA] 엔티티 매핑(1) - 객체와 테이블, 필드와 컬럼 매핑 (0) | 2022.09.30 |
[JPA] 영속성 관리 (0) | 2022.09.29 |
[JPA] JPQL : 객체 지향 쿼리 언어 (0) | 2022.09.29 |
[JPA] JPA 왜 사용할까? (0) | 2022.09.22 |
[JPA] 엔티티 변경 - 변경감지(Dirty Checking)와 병합(Merge) (0) | 2022.06.10 |