반응형
Spring Data JPA는 JPA가 제공하는 엔티티 그래프 기능을 편리하게 사용하게 도와주는데, 이 기능이 바로 @EntityGraph이다. JPQL로 fetch join을 직접 작성하지 않고 @EntityGraph 어노테이션을 붙임으로서 fetch join을 편리하게 사용할 수 있다. 즉, @EntityGraph는 fetch join을 적용해주기 때문에 N + 1 문제를 해결하고, 성능 최적화에 도움을 줄 수 있다. (fetch join의 간편 버전) fetch join 이란? => 2023.06.12 - [JAVA/JPA] - [JPA] JPQL의 fetch join(패치 조인)이란? 사용 방법 Member와 Team 엔티티가 있고 이 둘은 "1 : 다" 양방향 관계를 갖는다고 가정해보자. 이 때..
페이징 (Pageable, Page, Slice ) 데이터베이스의 대용량 데이터를 처리할 때, 데이터를 효율적으로 로드하고 출력하기 위해 페이지 단위로 데이터를 분할하여 가져오는 기능을 페이징이라고 한다. 페이징 적용 코드 다음과 같은 순서와 방식으로 페이징을 적용할 수 있다. public interface MemberRepository extends JpaRepository { Page findByAge(int age, Pageable pageable); } /** * 1. PageRequest 객체 생성 * PageRequest.of() 메소드를 사용하여 페이지 번호와 페이지 크기를 전달하며 PageRequest 객체를 생성할 수 있다. * 이때 정렬 조건이 있는 경우 추가적으로 Sort 객체도 함께..
메소드 이름으로 쿼리 생성 Spring Data JPA는 메서드 이름을 통해 쿼리를 작성해주는 쿼리 기능을 제공한다. (공식 문서 : Spring Data JPA - Reference Documentation) List findByUsernameAndAgeGreaterThan(String username, int age); 위 메서드 이름을 통해 실행도니느 쿼리는 다음과 같다. select m from Member m where m.username = :username and m.age > :age" 이 기능은 보통 파라미터 개수가 적을 때 사용한다. ( 파라미터 수가 많아지면 메서드 이름이 너무 길어져 가독성이 떨어짐 ) 그리고 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경..
public interface MemberRepository extends JpaRepository { } Spring Data JPA를 사용하면 위 처럼 JpaRepository 인터페이스를 상속받은 인터페이스만 있어도 CRUD 기능을 다 지원한다. 그렇다면 어떻게 인터페이스의 구현체가 없는데도 MemberRepository가 작동하는 걸까? How ? JpaRepository 인터페이스를 상속 받은 MemberRepository 클래스 타입을 찍어보면 다음과 같이 나온다. memberRepository.getClass() => class com.sun.proxy.$ProxyXXX Spring Data JPA가 JpaRepository 인터페이스를 상속받은 인터페이스를 보고 구현체를 만들어서 의존성 주..
OSIV (Open Session In View)OSIV란 스프링 프레임워크에서 사용하는 세션 관리 전략 중 하나로 스프링 부트에서는 기본 값이 True로 설정되어 있다.여기서 세션 (Session)은 하이버네이트의 세션. 즉, 영속성 컨텍스트를 뜻한다.용어를 그대로 해석하면, "View까지 영속성 컨텍스트를 열어 둔다"로 해석할 수 있고이는 영속성 컨텍스트가 View까지 살아 있도록 하는 것이다. spring.jpa.open-in-view: true영속성 컨텍스트는 트랜잭션의 생명 주기와 동일하다.하지만 이 옵션이 true로 설정된다면, 영속성 컨텍스트의 생명주기를 View에 응답이 갈 때 까지 유지시킨다.기본이 true이기 때문에 따로 설정을 하지 않았다면 Lazy 로딩을 사용했을 때트랜잭션 범위를 ..