https://velog.io/@jinyoungchoi95/JPA-모든-N1-발생-케이스과-해결책

→ 글 카피하면서 이해하기

JPA에 따라오는 꼬리표, N + 1

현재 글은 기본적으로 JPA에서의 즉시로딩과 지연로딩의 개념을 알고 있다는 전제하에 작성

N + 1이란?

<aside> 💡 조회 시 개의 쿼리를 생각학 설계를 했으나 나오지 않아도 되는 조회 쿼리가 N개 더 발생하는 문제

</aside>

JPA의 경우 객체에 대해서 조회한다고 해도 다양한 연관관계들의 맵핑에 의해 관계가 맺어진 다른 객체가 함께 조회되는 경우에 N + 1이 발생하게 된다.

예제로 사용할 연관관계

Untitled

가장 흔하게 볼 수 있는 다대일관계이다.

한 명의 User, 여러 개의 Article을 가질 수 있는 구조이다. (User: 1, Article : N)

@Entity
public class User {

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

    @Column(length = 10, nullable = false)
    private String name;

    @OneToMany(mappedBy = "user")
    private Set<Article> articles = emptySet();
}

@Entity
public class Article {

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

    @Column(length = 50, nullable = false)
    private String title;

    @Lob
    private String content;

    @ManyToOne
    private User user;
}

Fetch Type 같은 경우 현재 코드에서 적용해두지 않았지만 즉시로딩, 지연로딩 각각에 들어가서는 명시하여 사용한다.

(Fetch Type은 Default로 ToMany에서는 Lazy, ~ToOne에서는 Eager로 지정되어 있는데 이런 부분들은 Default옵션을 사용한다고 하더라도 명시해주는 것이 협업하는 다른 개발자가 보기에도 좋다)