[Spring] @Query 어노테이션 사용

WOOK JONG KIM·2022년 10월 31일
0
post-thumbnail

DB에서 값을 가져올때는 메서드 이름만으로 쿼리 메서드를 생성할 수도 있고, @Query 어노테이션을 사용해 직접 JPQL 작성 가능

JPQL을 사용하면 JPA 구현체에서 자동으로 쿼리 문장을 해석하고 실행

해당 DB에 특화된 SQL을 작성할 수 있으며, 주로 튜닝된 쿼리를 사용하고자 할때 직접 SQL 작성

기본적인 JPQL을 사용해 상품정보를 조회하는 메서드를 리포지토리에 추가

// data/repository/ProductRepository.java
@Query("SELECT p FROM Product AS p WHERE p.name = ?1")
List<Product> findByName(String name)

?1은 파라미터를 전달받기 위한 인자
-> 1은 첫번째 파라미터 의미

이 경우 파라미터의 순서가 바뀌면 오류가 발생할 가능성이 있어 @Param 어노테이션을 사용하는 것이 좋음

// data/repository/ProductRepository.java
@Query("SELECT p FROM Product p WHERE p.name = : name")
List<Product> findByNameParam(@Param("name") String name);

@Query 사용시 엔티티 타입이 아니라 원하는 칼럼의 값만 추출 가능

@Query("SELECT p.name, p.price, p.stock FROM Product p WHERE p.name = :name")
List<Object[]> findByNameParam2(@Param("name") String name);

메서드 이름을 기반으로 생성하는 JPQL의 한계는 @Query 어노테이션을 통해 대부분 해소할 수 있지만 직접 문자열을 입력하기에 컴파일 시점에서 에러를 잡지 못하고 런타임 에러가 발생할 수 있음

문자열이 잘못된 것을 애플리케이션이 실행된 후 로직이 실행되고 나서야 오류를 발견할 수 있다 -> 운영환경에서 배포 후 오류가 발견되는 리스크 유발

이러한 문제를 해결 하기 위해 사용되는 것이 QueryDSL
-> 문자열이 아니라 코드를 쿼리를 작성할 수 있도록 도와줌

profile
Journey for Backend Developer

0개의 댓글