QueryDSL의 페이징 카테시안 곱 문제 해결 방법 복잡한 일대다 연관관계를 가진 데이터를 페이징 처리할 때 어떤 어려움을 겪은 적이 있으신가요? 저는 실무에서 페이징을 처리하다 보면 목록을 조회할 때 단순하게 하나의 연관관계가 아니라 일대다의 연관관계를 한두 개가 아닌 여러 개를 같이 조회할 경우가 생기게 됬었습니다. 이때 평소와 같이 페이징을 구현했더니 결과는 제대로 나오지 않았습니다. 이유는 바로 1:N 관계에서 발생하는 카테시안 곱 문제 때문입니다. JPA를 사용한다면 다들 한번쯤 겪어볼 문제이기 때문에 해결하기 위한 전략과 팁을 공유하기 위해 작성했습니다. 카테시안 곱(Cartesian Product)이란? JPA에서의 카테시안 곱은 데이터베이스 쿼리 수행시 여러 테이블 간의 조인을 잘못 사용..
JPA
QueryDSL에서 JPA N+1 문제 해결하기 JPA를 배우며 N+1 문제에 대해 인지를 했지만, QueryDSL을 사용했을 때 어색하고, 잘 활용하지 못했던 경험이 있었습니다. 그래서 자주 사용하는 QueryDsl 기준으로 N+1문제를 해결하는 방법에 대해 알아보기 위해 글을 작성했습니다. JPA N+1 한 Entity를 조회했을 때 한 개의 쿼리가 생성되는 기댓값을 가지고 조회를 합니다. 하지만 어떤 상황의 경우에 한 개의 쿼리가 아닌 여러 개의 쿼리가 N개만큼 추가로 발생하는데 이것을 JPA의 N+1 문제라고 합니다. N+1문제가 발생하는 상황은 다음과 같습니다. 즉시 로딩 엔티티를 조회하는 경우 즉시 로딩의 경우 엔티티를 조회 할때마다 쿼리를 바로 날리기 때문에 N+1문제가 발생합니다. 지연 로..
JPA의 연관관계 예제 정리 실무에서 JPA를 사용하게 될 때, 가장 중요한 건 도메인의 설계이며 JPA의 연관관계를 바탕으로 어떻게 풀어나갈 것인가를 먼저 생각하게 됩니다. 각 테이블의 특성에 대한 연관관계를 생각한다면 맞지만 비즈니스의 요구사항에 따라 성능 문제를 해결하기 위한 설계를 해야 하며, 그에 따라 연관관계를 많이 고민해 보고 풀어나가야 한다고 생각합니다. 이전 글의 영속성 컨텍스트와 프록시에 이해를 바탕으로 이번 글에는 JPA가 객체와 RDBMS 사이를 어떤 형식으로 매핑하고 연관관계를 설정하는 건지 알아보는 시간을 갖도록 하겠습니다. JPA의 연관관계 연관관계를 설정할떄는 다음과 같이 바라볼 수 있습니다. 연관 관계의 방향: 단방향, 양방향 연관 관계의 주인: 양방향에서의 관리 주체 연관..
영속성 컨텍스트의 특징과 프록시 이해하기 이번 글에는 JPA의 필수 개념인 영속성 컨텍스트와 프록시에 대해 알아보겠습니다. JPA를 사용할 때 이 개념들을 모른다면 실무에서 JPA를 사용할 때 다양한 오류들을 만나게 되며 성능 부분에서 안 쓰는게 나을 정도로 심각한 문제를 야기할 수 있습니다. 그럼 개념에 대해 알아봅시다. 영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 뜻합니다. JPA는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트를 통해 애플리케이션 내에서 보관합니다. 엔티티를 저장하거나 조회하면 영속성 컨텍스트에 보관하고 관리하게 됩니다. 또한 아래와 같은 상태를 가집니다. 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속(managed..
JPA의 개념과 기본 설정 가이드 프로젝트에서 자주 사용했던 JPA에 대해 자세하게 알아보기 위해 이번 글에는 JPA의 개념과 기본 설정에 대해 알아보겠습니다. JPA란? JPA란 Java Persistence API의 약자로 자바 영속성 API를 의미합니다. JDBC를 이용해서 데이터베이스를 관리하는 인터페이스이며 이를 구현한 대표적인 라이브러리로 대표적인 것이 Hibernate입니다. 또한 JPA는 자바 ORM기술의 표준 API이며 ORM은 Object Relational Mapping의 약자이며 객체와 관계형 데이터베이스를 연결해 주는 개념을 뜻합니다. JPA의 사용 이유 SQL 중심적인 개발에서 DDL 문을 자동으로 생성해 주기 때문에 객체 중심적인 개발이 가능합니다. 필드 값을 수정할때 JPA는..