[Spring/Springboot] 도메인/양방향매핑/N+1 문제

2024. 12. 15. 23:07CS/Spring

 

Domain

  • Domain 객체는 애플리케이션의 핵심 비즈니스 로직과 관련된 데이터를 포함하는 객체로, 데이터베이스 테이블과 매핑되는 클래스
    • 역할: 데이터베이스 테이블과 1:1로 매핑 되는 객체로, 애플리케이션의 핵심 데이터를 담음
      • 이 객체는 비즈니스 로직을 포함할 수도 있음
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // getters and setters
}

양방향 매핑

  • 양방향 매핑은 연관 관계 주인이 아닌 엔티티에게도 연관 관계를 주입하는 것
  • [장점]
    • 객체 그래프 탐색으로 인한 이점
    • 필수적인 기능인 cascade의 설정이 가능

N + 1 문제

  • 조회 시 1개의 쿼리를 생각하고 설계를 했으나 나오지 않아도 되는 조회의 쿼리가 N개가 더 발생하는 문제
  • 프록시와 즉시로딩 주의
    • 가급적 지연 로딩만 사용(특히 실무에서)
    • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
    • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
    • @ManyToOne, @OneToOne은 기본이 즉시 로딩이기 때문에 → 따로 LAZY로 설정해줄 것
    • @OneToMany, @ManyToMany는 기본이 지연 로딩