JVM/JPA5 [JPA] N+1 발생 원인과 해결책 JPA N+1문제 1번의 쿼리를 조회하기 위해 설계하였으나, 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 문제 When . 언제 발생하는가 ? JPA Repository를 활용해 find 인터페이스 메소드를 호출할 때 발생 Who . 누가 발생시키는가 ? 1:N 또는 N:1 관계를 가진 엔티티 조회 시 발생 How . 어떻게 발생되는가 ? JPA Fetch 전략이 EAGER 전략으로 데이터 조회하는 경우 JPA Fetch 전략이 LAZY 전략으로 데이터를 가져온 이후, 연관 관계인 하위 엔티티를 다시 조회하는 경우 Why . 왜 발생하는가 ? JPA Repository find 메소드 실행 시 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고, 하위 엔티티를 사용할 때 추가로 조회하기 때문에 발생 .. JVM/JPA 2023. 5. 30. [JPA] QueryDSL 소개 및 프로젝트 설정하기 QueryDSL이란? QueryDSL은 하이버네이트 쿼리 언어(HQL: Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다. QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성할 수 있게 해 준다. 자바 백엔드 기술은 Spring Boot와 Spring Data JPA를 함께 사용한다. 하지만, 복잡한 쿼리, 동적 쿼리를 구현하는 데 있어 한계가 있다. 이러한 문제점을 해결할 수 있는 것이 QueryDSL이다. QueryDSL이 등장하기 이전에는 Mybatis, JPQL, Criteria 등 문자열 형태로 쿼리문을 작성하여 컴파일 시에 오류를 발견하는 것이 불가능했다. 하지만, QueryDSL은 자바 코드로 SQL 문을 작성할 수 있어 .. JVM/JPA 2023. 5. 25. [JPA] 기본 키 전략과 Entity Custom ID Generator 구현하기 JPA 기본키 생성 전략 관계형 데이터베이스에서 테이블은 각각의 행을 구별하는 기본키가 필요하다 기본키를 만들 때는 주민등록번호, 주문번호 같은 자연키 를 사용할 수도 있고, 논리적 의미가 하나도 없는 시퀀스와 같은 대체키를 사용할 수도 있다. @GeneratedValue JPA Entity 에서 @GeneratedValue 어노테이션을 기본키 필드 위에 붙이면 기본키를 자동으로 생성해주는 전략을 사용할 수 있다. 전략은 크게 4가지 이다. IDENTITY 기본키 생성을 hibernate가 아닌, 데이터베이스가 하도록 위임한다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long .. JVM/JPA 2022. 8. 5. [JPA] SpringBoot JPA 쿼리 로그 설정하기 SpringBoot JPA를 사용할 때, SQL 쿼리문을 표출하는 설정 관련해서 정리해보자. 요약 application.yml spring: jpa: properties: hibernate: show_sql: true format_sql: true use_sql_comments: true logging: level: org: hibernate: type: descriptor: sql: trace application.properties spring.jpa.properties.hibernate.show_sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.use_sql_comments=true logg.. JVM/JPA 2022. 7. 27. [JPA] JpaRepository를 상속 받은 인터페이스는 @Repository 없이 어떻게 인스턴스화될까? 개요 Spring Data JPA 를 사용한다면, 보통 Repository 인터페이스는 다음과 같을 것이다 import org.springframework.data.jpa.repository.JpaRepository; public interface MemberRepository extends JpaRepository { // ... } 위의 코드만 봤을 때는, MemberRepository가 @Repository 어노테이션 없이 어떻게 Bean을 등록되는 지 알 수 없다. JpARepository 내부 구현 코드를 들어가봐도 Bean 으로 등록해주는 코드는 존재하지 않았다. 이 궁금증을 시작으로 찾아보게 되었다. @EnableJpaRepositories 이 어노테이션은 JPA Repository 들을 활.. JVM/JPA 2022. 7. 26. 이전 1 다음 추천 글 728x90 반응형