기본적으로 QueryDSL에 대한 설명은 위 엔티티 모델을 기준으로 한다. 기본 Q-Type 활용 우선 Querydsl을 사용하기 위해서는 EntityManager을 이용해 JPAQueryFactory를 생성해야 한다. 새로운 엔티티를 만들었을 경우 gradle에서 compileJava를 해주어야 한다. Q 객체 생...
Querydsl 기본 문법
설정 방법
QueryDSL을 사용하기 위한 설정 방법 build.gradle 추가 //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importe...
스프링 데이터 JPA의 내부 구조 (em.merge)
스프링 데이터 JPA는 JPA를 매우 편리하게 사용하도록 해준다는 것을 알았다. 이제 이런 스프링 데이터 JPA가 어떤 방식으로 이렇게 편리하게 할 수 있도록 도와주는지 알아보자. 스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 @Repository @Transactional(readOnly ...
확장 기능 (사용자 정의 리포지토리, Auditing, 페이징- 등)
사용자 정의 리포지토리 스프링 데이터 JPA는 인터페이스만 정의하고 구현체를 스프링이 자동으로 생성해준다. 이 인터페이스를 직접 구현하려면 구현해야 하는 기능이 너무 많다. 하지만 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다? JPA 직접 사용 - EntityManager 스프링 JDBC Tempalt...
페이징과 정렬, 벌크성 수정 쿼리, EntityGraph, Lock
페이징, 정렬 비교를 위해 우선 JPA에서 페이징과 정렬을 사용하는 예제를 보자. 검색 조건: 나이가 10살 정렬 조건: 이름으로 내림차순 페이징 조건: 첫 번째 페이지, 페이지 당 보여줄 데이터는 3건 public List<Member> findByPage(int age, int offset, int limit) { ...
쿼리 메서드 기능
쿼리 메서드 스프링 데이터 JPA는 이전 포스트에서 설명했던 공통 메서드에 더불어 어떠한 커스텀 메서드까지 알아서 구현해준다. 예를 들어 이름과 나이를 기준으로 회원을 조회하고 싶다? public interface MemberRepository extends JpaRepository<Member, Long> { List<Memb...
공통 인터페이스 기능
스프링 데이터 JPA에 대한 포스팅은 위와 같은 간단한 도메인 모델을 기준으로 한다. JPA @Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em; public Member save(Member member) ...
OSIV
OSIV와 성능 최적화 OSIV -> Open Session In View 하이버네이트 Open EntityManager In View JPA OSIV ON OSIV 전략은 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와...
API 성능 최적화 - 컬렉션 조회 최적화
컬렉션 조회 최적화 ManyToOne, OneToOne 관계는 페치조인이 핵심이었다. 이러한 관계가 아닌, 컬렉션인 OneToMany 관계에서의 조회 그리고 최적화에 대해 알아보자. V1 - 엔티티 직접 노출 @GetMapping("/api/v1/orders") public List<Order> ordersV1() { List...
API 성능 최적화 - 지연 로딩 조회 성능 최적화
등록과 수정은 보통 거의 성능 문제가 발생하지 않는다. 단순하게 데이터 한 건을 삽입하고 삭제하는 그런 과정일 뿐이다. 주로 문제는 조회에서 발생한다. 조회를 하는 경우가 가장 많고 조회하는 데이터가 제일 많기 때문이다. 이 포스트를 시작으로 다양한 경우의 성능 최적화에 대해 알아본다. 지연 로딩과 조회 성능 최적화 컬렉션 조회 최적화 ...