Spring Data JPA - 쿼리 메소드, Sort, Named Query, SPEL

Spring Data JPA

백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글

쿼리 생성하기

쿼리는 Spring Data Common에 각 저장소마다 다르다.

스프링 데이터 몽고, 스프링 데이터 레디스 등이 모두 다르다는 이야기다.

JPA용 키워드가 별개로 있는데, 기본적으로 키워드는 굉장히 많다.

거기서 내가 모르는 것들만 좀 기록해보자면,

  • StartWith(해당 문자열로 시작하는 조건), EndingWith(반대), Containing(포함된 경우)

  • @NamedQuery(name = "클래스.메소드명, query = "JPQL 쿼리")

    • NamedQuery의 경우 Repository에 메소드를 정의하면 된다.

    • 그럼 NamedQuery 애노테이션에 정의된 쿼리를 찾아서 실행한다.

  • @NamedNativeQuery는 위 네임드 쿼리와 동일한데 쿼리가 네이티브 쿼리라는 것이 차이점.

  • @Query라는 애노테이션을 Repository 메소드 위에 선언해서 JPQL을 사용할수도 있다. 물론 Native Query를 사용하는 것도 가능하다.

Sort

Sort는 간단하다 메소드 인자로 Sort 클래스를 받아주면 된다.


postRepository.findByTitle("Spring",Sort.by("title")

Sort에 사용할 수 있는 값은 프로퍼티 또는 alias가 엔터티에 있는 경우

Named Parameter과 SpEL

@Query("SELECT p FROM Post AS p WHERE p.title = ?1")
fun findByTitle(title:String, sort:Sort):List<Post>

일반적인 JPQL 쿼리에서는 쿼리를 할 때 채번을 해야했다.

@Query("SELECT p FROM Post AS p WHERE p.title = :title")
fun findByTitle(@Param("title") title:String, sort:Sort):List<Post>

그러나 Named Paramter를 사용하면 채번으로 참조하지않고 이름으로 참조할 수 있다.

SPEL이란

스프링 표현언어인데 특이한 문법을 사용할 수 있다.

가령

@Query("SELECT p FROM #{#entityName} AS p WHERE p.title = :title")
fun findByTitle(@Param("title") title:String, sort:Sort):List<Post>

Entity 이름을 변수로 사용할 수 있다.

가령 #{#entityName}처럼 일반 변수를 이름으로 사용할 수 있다.

이 SPEL은 스프링 프레임워크에서 지원하는 언어이다.

이 언어를 사용하면 스프링 내에서 특별한(?) 문법을 사용할 수 있다.

이 때 Spring Data 또한 SPEL을 지원하고 있으며 entity의 이름을 변수로 사용하는 것이 가능하다.

Reference

인프런 백기선님의 스프링 Data JPA



© 2022. by minkuk

Powered by minkuk