ManyToOne의 N+1 문제

Halo·2025년 6월 24일
0

JAVA/Spring

목록 보기
15/15
post-thumbnail

👀 내용

가. 제 2 정규화

1. 쓰는이유
데이터 중복을 제거하고 데이터 무결성을 향상 시킨다.

2. 장점
쓰는 이유에서 적은 것처럼 중복 제거하고 무결성 향상시키고 데이터가 이상현상이 있으면 알아낼 수도 있다.

3. 단점
복잡하고 많은 Join 쿼리 연산량으로 인한 DB 부담 및 성능 저하

나. @ManyToOne

1. 쓰는 이유 (장점)
데이터 정규화 목적 그리고 DB의 테이블 관계를 시각적으로 파악 가능하다.

@ManyToOne(fetch = FetchType.LAZY)

위의 fetch type을 속성에 주게되면 해당 속성이 사용될 때만, DB에서 조회하기 때문에 SQL문 사용을 줄일 수 있다.

2. 단점
N+1 문제가 발생할 수 있다.

Many에서 One에 해당하는 속성을 조회할 때, DB에서 One을 계속 조사하니까 처음 1번 Many를 조사하고 이걸로 얻은 각 행(N)마다 1번씩 One을 조사하니까 두개를 더하면 N+1 인 것이다.

해결 방법
JPQL Fetch join문법을 사용한다.
즉, Join을 해서 한번에 다 가져온다는 것이다. Join 기준 컬럼을 기준으로 Many 엔티티와 One 엔티티 테이블을 합쳐서 가져오면 쿼리문이 한번만 실행하면 되기 때문이다.

다. @OneToMany
1. 쓰는 이유(장점)
가시성, 매핑관계를 코드상으로 보기에 유용하다.

2. 단점
연관된 데이터가 많으면 부담


📝 느낀점

JPQL Join Fetch를 써서 Join을 하여 메모리 용량을 쓰는 것이 SQL 쿼리문 여러번 호출하는것 보다 효과적이라는 것을 알았다.
물론 메모리가 너무 크면 둘 중에 어느것을 선택할지 적절하게 고려해봐야 할 것이다.


🛠️ 환경

항목Env Info
🖥️ 서버Tomcat
🍭 프레임워크Spring Boot
📀 데이터베이스MySQL with Azure
📝 JPAHibernate
🙈 외부 라이브러리lombok, thymeleaf, AJAX
📏 디자인 패턴MVC
profile
새끼 고양이 키우고 싶다

0개의 댓글