[Spring Boot] @Query 어노테이션

    📚코드로 배우는 스프링 부트 웹 프로젝트를 통해 공부한 내용들을 정리해보았습니다.

     

     


    78p - 81p

    @Query 어노테이션

     

    일반적인 경우에는 간단한 처리만 쿼리메서드를 이용하고, @Query를 이용하는 경우가 더 많습니다.

     

    @Query의 경우 메소드의 이름과 상관없이, 메서드에 추가한 어노테이션을 통해서 원하는 처리가 가능합니다.

    @Query의 value는 JPQL(Java Persistence Query Language)로 작성하는데 흔히 객체 지향 쿼리라고 불리는 구문들입니다.

     

    @Query로 할 수 있는 일

    • 필요한 데이터만 선별적으로 추출하는 기능
    • 데이터베이스에 맞는 순수한 SQL (Native SQL)을 사용하는 기능
    • insert,update,delete와 같은 select가 아닌 DML을 처리하는 기능(@Modifiying과 함께 사용)

     

    객체지향 쿼리(= JPQL)는 테이블 대신, 엔티티 클래스를 이용

    테이블의 칼럼 대신 클래스에 선언된 필드를 이용해서 작성합니다.

     

    실제 SQL에서 사용하는 함수도 JPQL에서 동일하게 사용할 수 있습니다.

     

     

    @Query의 경우 직접 SQL과 유사한 형태로 작성되기 때문에, 'where'구문과 그에 맞는 파라미터를 처리할 때가 있습니다.

     

    1. ':XXX'와 같이 ':파라미터이름'을 활용하기

    @Transactional
    @Modifying
    @Query("update Memo m set m.memoText = :memoText where m.mno = :mno ")
    int updateMemoText(@Param("mno") Long mno, @Param("memoText") String memoText);

    2. ':#{}'와 같이 자바 빈 스타일을 이용하는 방식

    @Transactional
    @Modifying
    @Query("update Memo m set m.memoText = :#{#param.memoText} where m.mno = :#{#param.mno}")
    int updateMemoText(@Param("param") Memo memo);

     

    @Query와 페이징 처리

     

    쿼리 메서드와 마찬가지로 @Query를 이용하는 경우에도 Pageable 타입의 파라미터를 적용하면 페이징 처리와 정렬을 생략할 수 있습니다. 따라서 @Query를 이용할 때는 별도의 countQuery라는 속성을 적용해주고 Pageable 타입의 파라미터를 전달하면 됩니다.

     

    @Query(value = "select m from Memo where m.mno > :mno", 
    	countQuery = "select count(m) from Memo m where m.no > :mno" )
        Page<Memo> getListWithQuery(Long mno,Pageable pageable);

     

    Object[] 리턴

    @Query 장점 

    쿼리 메서드의 경우 엔티티 타입의 데이터만 추출하지만, @Query를 이요하는 경우에는 현재 필요한 데이터만 []의 형태로 추출 가능합니다.

     

    예시는 80p 참고

     

     

    Native SQL 처리

    가장 강력한 기능은 데이터베이스 고유의 SQL문을 그대로 활용할 수 있다는 것입니다.

    JPA 자체가 데이터베이스에 독립적으로 구현이 가능하다라는 장점을 잃어버리긴 하지만, 

    경우에 따라서는 복잡한 JOIN 구문등을 처리하기 위해서 어쩔 수 없는 선택을 하는 경우에 사용됩니다.

     

     

    @Query의 nativeQuery 속성값을 true로 지정하고 일반 SQL을 그대로 사용할 수 있습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    728x90

    댓글