https://velog.io/@jinyoungchoi95/JPA-모든-N1-발생-케이스과-해결책
→ 글 카피하면서 이해하기
현재 글은 기본적으로 JPA에서의 즉시로딩과 지연로딩의 개념을 알고 있다는 전제하에 작성
<aside> 💡 조회 시 개의 쿼리를 생각학 설계를 했으나 나오지 않아도 되는 조회 쿼리가 N개 더 발생하는 문제
</aside>
JPA의 경우 객체에 대해서 조회한다고 해도 다양한 연관관계들의 맵핑에 의해 관계가 맺어진 다른 객체가 함께 조회되는 경우에 N + 1이 발생하게 된다.

가장 흔하게 볼 수 있는 다대일관계이다.
한 명의 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옵션을 사용한다고 하더라도 명시해주는 것이 협업하는 다른 개발자가 보기에도 좋다)