[JPA] Query 커스텀하기 - Spring Data JPA, @Query, NativeQuery

koline·2024년 1월 18일

JPA

목록 보기
7/11

앞선 JPA 사용법에 관련하여 기본적인 사용법을 다뤘었는데, 기본적인 메소드만 사용하여 프로그램을 개발하기는 한계가 있다.

JpaRepository에 커스텀 쿼리를 추가하여 사용하는 방법을 알아보자.

아래는 이 시리즈에서 계속 사용하던 테스트 코드를 기반으로 작성되었다.

// JpaRepository를 상속하여 사용. <객체, ID타입>
@Repository
public interface TestRepository extends JpaRepository<TestEntity, Long> {

	/**
     * TestEntity 목록을 조회하는 쿼리
     * 
     * @Query 어노테이션을 사용해서 쿼리를 작성해준다.
     * 이 때 쿼리는 JPQL 문법을 따른다.
     * Pageable 객체를 파라미터로 받으면 별도로 쿼리에 작성을 안해도
     * pageable 객체의 필드로 전달된 페이징 정보를 적용하여 쿼리한다.
     */
	@Query("SELECT e FROM TestEntity e ORDER BY e.id DESC")
    List<TestEntity> selectList(Pageable pageable);
    
    /**
     * 파라미터 전달하는 방법 예시
     *
     * 파라미터를 전달하고 싶을 때는 @Param 어노테이션을 사용해 받아주고
     * 받아온 파라미터는 쿼리 내에서 ':파라미터명'의 형태로 작성해준다.
     */
    @Query("SELECT e FROM TestEntity e WHERE e.val1 = :val1 ORDER BY e.id DESC")
    List<TestEntity> selectListByVal1(Pageable pageable, @Param("val1") String val1);
    
    /**
     * NativeQuery 사용하는 방법 예시
     *
     * JPQL이 아닌 NativeQuery 쿼리를 사용하기 위해서는 'nativeQuery = true'
     * 옵션을 추가해주면 된다.
     */
    @Query(value = "SELECT COUNT(1) FROM TEST_ENTITY WHERE VAL2 = :val2", nativeQuery = true)
    long countByVal2(@Param("val2") String val2);

}

기본적으로 SQL 문법(Native Query)이 아닌 JPQL 문법을 따른다.

JPQLJava Persistence Query Language의 약자로 이름에서부터 알 수 있듯이 'JPA에서 사용하는 Query Language' 정도로 이해하면 될 것 같다.

문법도 SQL 문법과 약간의 차이가 있는데, JPA의 특성을 이해하면 차이가 눈에 쉽게 보일 것이다.

바로 Data를 객체로 인식한다는 점이다. 즉, 테이블이 아닌 엔티티 객체를 대상으로 질의함으로써, SQL 추상화로 인해 특정 Database나 그 언어에 의존하지 않고 객체지향적으로 질의할 수 있다.

profile
개발공부를해보자

0개의 댓글