Web/JPA

    [Data JPA] EP 6. 나머지 기능들

    목차 (클릭시 해당 목차로 이동) Projections close projection : 가져오고 싶은 부분만 딱 맞춰서 쿼리날려서 가져오기 open projection : 일단 엔티티를 다 가져와서 애플리케이션에서 골라내기 인터페이스 기반의 close projection 만약 전체 엔티티가 아니라 회원 이름만 딱 조회하고 싶으면 보통 DTO를 사용합니다. projections는 엔티티 대신에 DTO를 조회할때 사용하는 기능입니다. 인터페이스만 정의하면 실제 구현체는 스프링 데이터 jpa가 프록시 기술을 이용해 만들어줍니다. package study.datajpa.repository; import org.springframework.beans.factory.annotation.Value; public i..

    [Data JPA] EP 5. 스프링 데이터 JPA 분석

    목차 (클릭시 해당 목차로 이동) 스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA 구현체 찾기 JpaRepository의 구현클래스 중에서 SimpleJpaRepository가 스프링 데이터 JPA 구현체 입니다. SimpleJpaRepository를 들어가보면 @Repository, @Transactional(readOnly = true)가 걸려있습니다. 특징 1. jpa의 exception을 spring의 exception으로 매핑해 바꿔줍니다. (서비스계층으로 exception이 바껴서 올라감) 그래서 하부 구현기술(예를들어 jpa->jdbc)을 바꿔도 기존 비즈니스 로직에 영향을 주지 않습니다. 2. 구현체의 메소드에서 @Transaction이 걸려있기 때문에 스프링 데이터 JPA를 Tra..

    [Data JPA] EP 4. 확장 기능

    목차 (클릭시 해당 목차로 이동) 사용자 정의 리포지토리 구현 Data JPA를 사용하다보면 인터페이스의 메소드를 직접 구현해야할 때가 있습니다. JPA 직접 사용(EntityManager) JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접사용 QueryDSL 사용 이때 Data JPA의 인터페이스를 직접 구현하는 것은 너무 많기때문에 Data JPA에서 사용자 정의 리포지토리 구현 기능을 제공합니다. 사용자 정의 리포지토리 구현 기능 사용법 직접 구현할 메소드가 있는 인터페이스 (아무이름) (ex. MemberRepositoryCustom) 을 만듭니다. 구현클래스 MemberRepository...Impl 로 이름을 짓고 MemberRepositoryCustom를 상속받아 메..

    [Data JPA] EP 3. 쿼리 메소드 기능 -2

    벌크성 수정쿼리 벌크성 수정쿼리는 영속성 컨텍스트를 거치지 않고 바로 DB에 쿼리를 날려 update를 하는 쿼리입니다. 예를들어 "어떤 나이 이상인 사람들의 나이를 전부 1살 올려라" 라는 요구사항을 구현할때 굳이 애플리케이션 로직에서 수행하지 않고 DB에 직접 쿼리를 날리는 것이 효율적일 때가 있습니다. 그럴때 사용하는 것이 벌크성 수정쿼리입니다. @Query에다가 직접 update쿼리를 작성합니다. 보통 벌크성 수정쿼리는 반환값으로 resultList가 아닌 수정된 데이터의 개수를 받습니다. 그럴 때 메서드에@Modifying을 적어주면 getResultList()가 아닌 executeUpdate()를 호출해서 수정된 데이터의 개수를 받을 수 있습니다. @Modifying @Query("update..

    [Data JPA] EP 2. 쿼리 메소드 기능

    목차 (클릭시 해당 목차로 이동) 메소드 이름으로 쿼리 생성 Data JPA에서 공통적으로 제공하는 메소드 이외에도 필요한 메소드가 있을 수 있습니다. 예를들어 "어떤 이름을 가진 회원중 나이가 15 이상인 회원을 구해라" 같은 쿼리는 엔티티에 의존한 쿼리입니다. 이럴 때도 Data JPA를 이용할 수 있습니다. 메소드 이름으로 쿼리를 생성할 수 있습니다. 이렇게 MemberRepository 인터페이스에서 해당 쿼리 이름으로 메소드를 선언만 해도 동작합니다. 하지만 이 방법을 사용하려면 Data JPA에서 정하는 메소드 이름 프로퍼티를 정확하게 맞추어 사용해야합니다. Spring Data JPA에서 메소드 이름에 대한 규칙은 공식문서에서 확인이 가능합니다. https://docs.spring.io/sp..

    [Data JPA] EP 1. 공통 인터페이스 기능

    공통 인터페이스 설정 Data JPA를 사용하는 방법 Repository를 interface로 만듭니다. JpaRepository를 상속받는데 이때 을 넣어주시면 됩니다. package study.datajpa.repository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.sprin..

    EP5. OSIV와 성능 최적화

    OSIV (Open Session In View) 풀네임 하이버네이트 에서는 Open Session In View JPA에서는 Open EntityManager In View 이다. 뜻 OSIV가 off 이면 트랜잭션을 종료할때 영속성 컨텍스트 닫히면서 데이터 커넥션도 반환한다. 그런데 OSIV가 on이면 트랜잭션이 끝난 이후에도 영속성 컨텍스트가 살아있고 데이터 커넥션 풀이 계속 존재한다. 그래서 지연로딩과 같은 전략을 사용할 수 있다. 장단점 OSIV on 장점 : 지연로딩을 사용할 수 있다. 단점 : 데이터커넥션 풀이 유지되는 리소스가 크다. OSIV off 장점 : 데이터 커넥션 풀을 원하는 시간만 사용하기 때문에 자원의 낭비가 없다. 단점 : 지연로딩을 사용할 수 있고 사용하려면 트랜잭션이 끝나..

    EP4. API 개발 순서

    한눈에 정리 엔티티 조회 엔티티는 그대로 반환하지 말고 DTO로 변환해서 반환해라 컬렉션은 패치조인 하지말고 지연로딩을 유지후 BatchSize로 최적화해라 DTO 직접 조회 컬렉션은 IN 절을 이용해 메모리에 미리 조회해서 최적화해라 API 개발 순서 1. 엔티티 조회 방식으로 먼저 접근하기 1) 페치 조인으로 쿼리 수를 최적화한다. 2) 컬렉션을 최적화해라 1. 페이징이 필요하면 hibernate.default_batch_fetch_size 혹은 @BatchSize로 최적화해라 2. 페이징이 필요 없다면 페치조인을 사용해라 2. 엔티티 조회 방식으로 해결이 안되면 DTO 조회 방식을 사용해라 1) 컬렉션은 IN 절을 이용해 메모리에 미리 조회해서 최적화해라 3. DTO 조회 방식으로도 해결이 안되면 ..

    EP3. 컬렉션 조회 최적화 - 2 (JPA에서 DTO 직접조회)

    2021.04.06 - [Web/JPA] - EP2. 지연 로딩과 조회 성능 최적화 2021.04.07 - [Web/JPA] - EP3. 컬렉션 조회 최적화 - 1 EP3. 컬렉션 조회 최적화 - 1 주문내역에서 주문한 상품정보까지 추가로 조회 해보자. EP2 에서는 @XToOne 을 조회하는 기능을 최적화 했었다. 2021.04.06 - [Web/JPA] - EP2. 지연 로딩과 조회 성능 최적화 여기서는 @XToMany인 컬렉션을 ksabs.tistory.com 앞에서는 엔티티를 DTO로 변환해서 컬렉션으로 반환했다. 이번에는 DTO를 그대로 반환해서 JPA가 DTO를 직접 조회하게 만들어 보겠다. JPA에 DTO를 직접 반환 하는것의 장단점은 이미 정리를 해봤었다. 장점 쿼리가 한번만 나간다. 원하..

    EP3. 컬렉션 조회 최적화 - 1

    주문내역에서 주문한 상품정보까지 추가로 조회 해보자. EP2 에서는 @XToOne 을 조회하는 기능을 최적화 했었다. 2021.04.06 - [Web/JPA] - EP2. 지연 로딩과 조회 성능 최적화 여기서는 @XToMany인 컬렉션을 조회하는 기능을 구현하고 최적화 해보자. Order 엔티티에서 컬렉션인 OrderItem과 OrderItem의 Item이 필요하다. Item도 Order 기준으로는 컬렉션이다. Order package jpabook.jpashop.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence..