본문 바로가기

Spring

[Spring] jpa entity 설계 시 주의점

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' 강의를 듣고 작성한 글입니다