Spring Data JPA는 Spring Data 패밀리 기술 중 하나로써, JPA 스펙을 구현한 구현체의 API를 조금 더 쉽게 사용할 수 있도록 해주는 모듈이다.
Spring에서는 애플리케이션이 특정 기술에 결합되지 않도록 Spring이 추구하는 PSA를 통해 개발자는 일관된 코드 구현 방식을 유지하도록 하고, 기술의 변경이 필요할 때 최소한의 변경만을 하도록 지원한다. (Spring Data JDBC -> Spring Data JPA)
public interface CoffeeRepository extends JpaRepository<Coffee, Long> { // (1)
Optional<Coffee> findByCoffeeCode(String coffeeCode);
// @Query(value = "FROM Coffee c WHERE c.coffeeId = :coffeeId") // (2-1)
// @Query(value = "SELECT * FROM COFFEE WHERE coffee_Id = :coffeeId", nativeQuery = true) // (2-2)
@Query(value = "SELECT c FROM Coffee c WHERE c.coffeeId = :coffeeId") // (2-3)
Optional<Coffee> findByCoffee(long coffeeId);
}
(1)과 같이 Spring Data JDBC와 비교했을 때, CrudRepository
를 상속하는 대신 JpaRepository
를 상속한다.
JPA에서는 복잡한 검색 조건을 지정하기 위한 몇 가지 방법을 제공한다.
JPQL을 통한 객체 지향 쿼리 사용
coffeeId
에 해당하는 커피 정보를 조회하는데, SQL과 유사하지만 차이점이 있음Coffee
클래스라는 객체를 지정해야하고, coffee_id라는 컬럼이 아닌 coffeeId 필드를 지정해야 함SELECT c FROM Coffee c WHERE c.coffeeId = :coffeeId
”에서 Coffee
는 클래스명이고, coffeeId
는 Coffee
클래스의 필드명c
’는 Coffee
클래스의 별칭이기 때문에 “SELECT c FROM~
” 와 같이 SQL에서 사용하는 ‘*
’이 아니라 ‘c
’로 모든 필드를 조회SELECT c
’를 생략한 형태로 사용이 가능네이티브 SQL을 통한 조회
nativeQuery
애트리뷰트 값을 true
로 설정하면 value
애트리뷰트에 적용한 SQL 쿼리가 적용참고 사항
Spring Data JDBC의 @Query
vsSpring Data JPA의 @Query
Spring Data JDBC와 Spring Data JPA에서 사용하는@Query
애너테이션은 이름은 같지만 패키지 자체가 다르다.
만약, Starter 모듈이 둘 다 의존 라이브러리에 포함되어 있는 경우, 패키지 경로를 혼동하지 않도록 주의해야 한다.
Spring Data JDBC의 @Query
애너테이션 패키지 경로
import org.springframework.data.jdbc.repository.query.Query
- Spring Data JPA의 @Query` 애너테이션 패키지 경로
org.springframework.data.jpa.repository.Query