# JPA N+1 문제

## N+1 문제란?

조회 쿼리 (1) + 조회된 결과에 대한 단건 쿼리 (N) 이 발생하여, 1개의 쿼리로 처리하려고 기대하였으나, 연관된 엔티티로 인하여 N개의 추가 쿼리가 발생하여 성능상 문제가 되는 JPA 의 주요 성능 최적화 포인트&#x20;

### 문제가 발생하는 이유

객체 지향과 데이터베이스간 **패러다임의 차이** 때문에 발생한다.

#### 객체지향 엔티티 (엔티티 클래스)

* 객체 지향 그래프는 방향성을 가지고 있음
* 객체는 컬렉션을 표현할 수 있음 (List, Set, Map 과 같은 자료 구조)

#### 데이터베이스 엔티티 (RDB 에서의 릴레이션, 즉 테이블)

* 데이터베이스는 조회 결과에 대한 방향성이 없다. 연관관계만 있을 뿐이다.
  * 이것은 무엇을 의미하나? A 테이블과 B 테이블의 조인 결과와 B 테이블과 A 테이블의 조회 결과는 똑같다는 것을 의미
  * (조회 결과 그림으로 표현)
* 데이터베이스는 정규화가 잘된 테이블이라면 중복이 없고 각 Row 는 하나의 인스턴스를 의미한다.

### 문제가 발생하는 케이스

### 해결 방법

## 🚨 컬렉션 페이징 안되는 문제

{% embed url="<https://coco-log.tistory.com/127>" %}

## 🚨 `@OneToOne` 연관관계 주인이 아는 쪽에서는 Lazy Loading 이 불가능하다.

* 검색해보면 '프록시는 `null` 을 감쌀 수 없기 때문이다.' 라는 답변을 얻을 수 있다.&#x20;
* 그런데 왜? proxy 가 null 을 못 감싸지? 라는 의문이 든다면... 그것은 **그냥 JPA 스펙이 값이 없음을 null 로 표현하기 때문**이다.&#x20;
* 프록시도 객체기 때문에 값이 없음 이라는 상태를 프록시가 감싼 null 로 표현할 수 없는 것이다.
* JPA 는 값이 있고 없음을 null 체크로 처리하는 것으로 생각된다.

<figure><img src="/files/u6L4EJ2YjAB3smqDFc8h" alt=""><figcaption></figcaption></figure>

{% embed url="<https://www.inflearn.com/questions/467135/one-to-one-lazy%EB%AF%B8%EB%8F%99%EC%9E%91-%EB%A9%94%EC%BB%A4%EB%8B%88%EC%A6%98%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://programmer-jjy.gitbook.io/second-brain/technical/trouble-shooting/jpa-n+1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
