JPA_Chap12_스프링 데이터 JPA

윤일권·2023년 6월 27일
0

JPA

목록 보기
9/11

스프링 데이터 JPA

  • 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있다.
  • 리포지토리 인터페이스의 구현체는 애플리케이션 실행 시점에 스프링 데이터JPA가 생성해서 주입해주기 때문에 개발자가 직접 구현체를 개발하지 않아도 된다.

공통 인터페이스 기능

  • JPA는 간단한 CRUD 기능을 공통으로 처리한는 JpaRepository 인터페이스를 제공.
  • JpaRepository 인터페이스를 상속박고 제네릭에 엔티티 클래스와 엔티티 클래스가 사용하는 식별자 타입을 지정.
    • 주요 메서드

쿼리 메소드 기능

  • 인터페이스에 메소드만 선언하면 해당 메소드의 이름으로 적절한 JPQL쿼리를 생성해서 실행한다.
  • 쿼리 메소드 기능
    • 메소드 이름으로 쿼리 생성
    • 메소드 이름으로 JPA
    • @Query 어노테이션을 사용해서 리포지토리 인터페이스에 쿼리 직접 정의
      • 네이티브 SQL을 사용하려면 @Query 어토네이션에 nativeQuery = true를 설정.
  • 스프링 데이터 JPA는 위치 기반 파라미터 바인딩과 이름 기반 파라미터 바인딩을 모두 지원
  • 페이징과 정렬 제공
    • ...data.domain.Sort : 정렬
    • ...data.domain.Pageable: 페이징 기능(내부에 Sort포함)
    • 검색된 전체 데이터 건수를 조회하는 count쿼리를 추가로 호출 가능

명세

  • 술어 : 단순히 참이나 거짓으로 평가
  • Specification 클래스로 정의
  • Specification는 명세들을 조립할 수 있도록 도와주는 클래스인데 where(), and(), or(), not() 메소드를 제공.

스프링 데이터 JPA가 사용하는 구현체

  • @Repository 적용 : JPA 예외를 스프링이 추상화한 예외로 변환.
  • @Transactional 트랜잭션 적용 : JPA의 모든 변경은 트랜잭션 안에서 이뤄져야한다. 서비스 계층에서 트랜잭션을 시작하지 않으면 리포지토리에서 트랜잭션을 시작.
  • @Transactional(readOnly = true) : readOnly = true를 적용하면 플러시를 생략해서 약간의 성능 향상을 얻을 수 있다.
  • @save() 메소드 : 저장할 엔티티가 새로운 엔티티면 저장하고 이미 있는 엔티티면 병합한다.

스프링 데이터 JPA와 QueryDSL 통합

  • org.springframework.date.querydsl.QueryDslPredicateExecutor
  • org.springframework.date.querydsl.QueryDslRepositorySupport
  • QueryDslPredicateExecutor
    • QuertDSL을 사용할 수 있지만 기능에 한계 -> join, fetch,를 사용할 수 없다.
  • QueryDslRepositorySupport
    • QueryDSL의 모든 기능을 사용하려면 JPAQuery 객체를 직접 생성해서 사용하면 된다.
    • QueryDslRepositorySupport를 상속받아 사용하면 조금 더 편리하게 QueryDSL을 사용할 수 있다.
profile
생각하는 개발자가 되겠습니다!!

0개의 댓글