JPA(Java Persistence API)에서 N+1 문제는 데이터베이스 쿼리를 실행할 때 발생하는 성능 문제 중 하나입니다.N+1 문제란?연관관계에서 발생하는 이슈로 연관관계가 설정된 부모 엔티티를 조회할 경우 조회된 자식 엔티티들만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 됩니다. 이를 N+1 문제라고 합니다. 예를 들어 N+1 문제는 다음과 같은 상황에서 발생합니다.1개의 쿼리로 특정 객체를 로딩합니다. (예: 부모 객체)이후 해당 객체와 관련된 N개의 객체를 가져와야 합니다. (예: 자식 객체들)N개의 객체를 가져오기 위한 쿼리가 N번 만큼 추가로 실행됩니다. 설명을 위한 엔티티 예제단순하게 부모 객체와 자식 객체 관계로 표현해보겠습니다.부모는 여러 자식을 키우고 있다.자식들..
연관관계를 맺은 엔티티를 모두 포함시켜 조회하는 경우 비효율적일 수 있습니다. 굳이 불필요한 정보까지 조회하기 위해 쿼리가 복잡해지면 성능에도 영향을 끼칠 수 있기 때문입니다. JPA(Java Persistence API)는 이러한 문제를 대비하여 지연 로딩과 프록시를 제공합니다. 지연 로딩은 연관된 엔티티를 실제로 필요할 때까지 로딩을 지연시키는 방식으로, 성능을 향상하고 불필요한 쿼리를 방지합니다. 프록시는 실제 엔티티 대신 사용되며, 필요한 경우 실제 엔티티를 가져오게 됩니다. 프록시(Proxy)지연 로딩을 이해하려면, 먼저 프록시의 개념을 이해해야 합니다. JPA는 EntityManager를 통해 엔티티를 조회하는 메서드를 제공합니다. 앞으로 EntityManager를 em으로 축약하여 부르겠습니..
JPA(Java Persistence API)를 이해하는 데 어려움을 겪는 이유 중 두 가지는 영속성 컨텍스트의 작동 메커니즘과 연관관계 매핑입니다. 이번 포스팅에서는 연관관계 매핑에 대해 정리해보고자 합니다. JPA는 객체 지향 프로그래밍과 데이터베이스 간의 패러다임 불일치를 해결하기 위해 설계되었습니다. 이를 통해 객체지향적인 개발 방식을 지원하며, 연관관계 매핑은 이러한 패러다임 불일치를 해소하고 객체지향적인 개발을 용이하게 합니다. 연관관계 정의 규칙 연관관계를 매핑할 때 고려해야 할 사항은 다음과 같이 3가지로 구분됩니다. 방향: 단방향, 양방향 (객체 참조) 연관관계의 주인: 양방향 관계에서 관리 주체가 되는 엔티티 (FK를 가지는 테이블) 다중성: 다대일(N:1), 일대다(1:N), 일대일(..
이번 포스팅은 영속성 컨텍스트에 대해 설명해보려고 합니다. 영속성 컨텍스트를 배우기 위해 먼저 EntityManagerFactory와 EntityManager를 알아야 합니다. EntityManagerFactory & EnitityManger란? EntityManagerFactory는 애플리케이션 전체에 단 하나만 생성되며 영속성 유닛과 연결을 설정하고 관리합니다. 이 과정에서 DB 커넥션 풀을 생성하게 됩니다. 그리고 클라이언트의 요청이 들어올 때마다 EntityManager를 생성하고, 각 EntityManager는 특정 작업을 수행하기 위해 사용됩니다. EntityManager는 영속성 컨텍스트를 관리하며, 이를 통해 엔티티 객체의 상태를 추적하고, 트랜잭션이 시작되는 시점에 EntityManage..