1. 엔티티에는 가급적 Setter를 사용하지 말자
=> Setter가 모두 열려있는 경우, 변경 포인트가 너무 많아서 유지보수가 어려움
2. 모든 연관관계는 지연로딩(LAZY)으로 설정하자
=> 즉시 로딩(EAGER)은 조회 시점에 FK로 연결되어 있는 테이블 정보까지 모두 조회되기 때문에 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어려움 (JPQL 실행시 1 + N(FK 테이블) 문제 발생)
=> 연관된 엔티티를 조회해야 한다면, fetch join 또는 엔티티 그래프 기능 사용
=> @OneToOne, @ManyToOne 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야함
3. 컬렉션은 필드에서 초기화하자
=> 컬렉션은 필드에서 바로 초기화 하는 것이 안전하다.
=> null pointer exception 문제에서 안전
=> hibernate가 엔티티를 영속화 할 때, 컬렉션을 감싸서 hibernate가 제공하는 내장 컬렉션으로 변경. 만약 setter를 사용해 임의의 메서드에서 컬렉션을 잘못 생성하면 hibernate 내부 메커니즘에 문제가 발생할 수 있음. 때문에 필드레벨에서 생성하는 것이 가장 안전하고, 코드도 간결함
=> 즉, 아래와 같이 초기화하고, 이후 가급적이면 변경하지 않아야 함
private List<Order> orders = new ArrayList<>();
4. 테이블, 컬럼명 생성 전략
=> 변경된 스프링 부트 기본 매핑 전략
1. 카멜케이스 -> 언더스코어
2. .(점) -> _(언더스코어)
3. 대문자 -> 소문자
5. casecade 옵션
@XToOne(cascade = CascadeType.ALL)
=> 클래스 내부 필드에 위와 같이 어노테이션 설정 시 클래스 객체 영속 시 클래스 내부 필드를 따로 영속해줄 필요 없음
// 원래 코드
persist(orderItemA)
persist(orderItemB)
persist(order)
// orderItem 필드 cascade 옵션 사용시
persist(order)
6. 연관관계 편의 메서드
=> 양방향 관계를 원자적으로 묶는 메소드를 만드는 것
** 해당 글은 '실전! 스프링 부트와 JPA 활용1' 강의를 듣고 작성한 글입니다
'Spring' 카테고리의 다른 글
[Spring] 엔티티를 노출한 API 생성하기 (0) | 2023.04.21 |
---|---|
[Spring] JPA Auditing - BaseTimeEntity (0) | 2023.04.21 |
[Spring] 변경 감지와 병합(merge) (1) | 2023.04.19 |
[Spring] AWS + Docker 이용해 서버 배포하기 (0) | 2023.04.18 |
[Spring CICD] AWS + Docker + Github Action 이용해 서버 자동배포하기 (1) | 2023.04.18 |