개요 이번 글에서는 Spring Data JPA에서 @ManyToOne 관계를 가지는 엔티티를 조회할 때 발생하는 N + 1 문제를 해결하는 방법에 대해 이야기해 보려고 합니다. 배경 최근에 사내에 ORM을 사용하는 프로젝트가 많아지면서 @ManyToOne 관계를 가지는 엔티티를 조회할 때 N + 1 문제에 대해 고려하지 않고 개발되어 조회 쿼리가 추가적으로 발생되는 이슈가 있어 N + 1 문제가 무엇인지 알아보고 어떻게 해결하는지에 대해 설명해 보겠습니다. N + 1 문제란? 연관 관계가 설정된 Entity를 조회할 경우에 조회된 데이터 개수(N) 만큼 연관관계의 조회 쿼리가 추가로 발생하는 문제이다. N + 1 문제 예시 - Lazy Loading @Entity @Getter public class ..
개요 저번 포스팅에서는 프로젝트에 Spring Security를 적용하여 임시적인 옵션들을 구성해 주었다. 이번 포스팅에서는 본격적인 API 개발을 위해 루트가 되는 Game 엔티티를 설계해 보겠다. Game Entity 설계(1) - 디렉토리 생성 및 클래스 생성 사진과 같이 Game이라는 도메인을 대표하는 루트 디렉토리 밑에 Entity라는 하위 디렉토리를 생성하여 Game이라는 클래스 파일을 생성해 준다. Game Entity 설계(2) - Entity 설계 package com.gamepleconnect.game.entity; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persi..
개요 이번 글에서는 JPA에서 findBy 매서드를 매개변수 없이 사용하는 방법에 대해 이야기해보려고 한다. 매개변수 없이 사용하면 좋은 점? 예를 들어 위와 같은 데이터가 있고 "삭제되지 않은" 데이터들을 불러올 때 우리는 다음과 같이 코드를 작성할 수 있다. List findAllByDeleteYn(boolean active); 이때 서비스 로직에서 active라는 매개변수값을 false로 넘겨주며 원하는 결과를 얻을 수 있을 것이다. 위와 같은 매서드는 삭제된 게시물만 조회하는 기능이 있는 운영툴과 같은 환경에선 확장성 있는 구조로 쓰일 수 있겠지만 사용자들이 직접 이용하는 환경에서는 삭제된 게시물이 노출되는 불상사가 발생할 수 있다. 우리는 "삭제되지 않은" 데이터들만 보여주길 원하는데 activ..