2025. 5. 3. 22:15ㆍJava/Spring
프로젝트를 진행하면서 내가 직접 쿼리를 사용해 구현하고 싶은 것이 생길 때 사용하는 것이 JPQL or NativeQuery입니다.
코드 관점으로 보면 두 개의 개념은 비슷합니다. 원래 JPA만 사용할 경우 메서드 명명규칙에 따라서 자동으로 쿼리를 생성해 주는데, 이게 아닌 개발자가 직접 원하는 결과를 반환하는 쿼리를 작성하는 것입니다.
다만, 차이점이라고 하면 쿼리 작성 요령이 다릅니다.
ex) "user"라는 테이블에서 모든 값을 가져오고 싶을 때
1. JPQL의 경우
@Query(value = "SELECT * FROM User WHERE id = ?1")
Optional<User> selectAll(String id);
2. Native Query의 경우
@NativeQuery(value = "SELECT * FROM user WHERE id = ?1")
Optional<User> selectAll(String id);
각각 선언하는 어노테이션이 다른 것도 있지만, JPQL의 경우 JPA의 엔티티를 대상으로 쿼리를 작성해야 합니다. 무슨 뜻이냐면 조회하려는 테이블명 및 필드명을 우리가 만들었던 엔티티에 정의되어 있는 명칭으로 해야 하는 것입니다. (컬럼명 x)
반면에 Native Query의 경우 SQL 작성하는 것과 똑같이 작성하면 됩니다.
파라미터 사용
보통 쿼리를 작성한다고 하면 조건 없이는 작성을 안 합니다. 최소한 PK 값을 이용해서 조회한다거나, 다양한 값들을 통해 조회하겠죠. ex) 검색할 때 상품명, 가격, 카테고리 조건을 통해 조회를 해야 할 경우
그러면 위와 같이 JPQL or Native Query를 사용하게 될 경우, 파라미터 값을 프론트 -> 백엔드로 받아서 쿼리를 작성할 때 사용하면 됩니다.
숫자 사용
조건으로 사용할 파라미터가 적을 경우에는 단순하게 숫자로 사용하는 방법이 있습니다.
@Query(value = "SELECT * FROM User WHERE id = ?1 and name = ?2")
Optional<User> selectAll(String id, String name);
@NativeQuery(value = "SELECT * FROM user WHERE id = ?1 and name = ?2")
Optional<User> selectAll(String id, String name);
파라미터명 사용
파라미터가 많아질 경우에는 위의 숫자 방식을 사용하기에는 쿼리가 많이 복잡해질 수 있습니다. 그럴 때는 파라미터명을 설정해 주고 사용하는 방법이 있습니다.
@Query("SELECT *
FROM
User u,
Product p
WHERE
u.num = p.user_num AND u.num = :userNum
AND product_name = :productName
AND price = :price
AND u.name = :name")
Optional<User> selectUserProduct(@Param("userNum") Long num, @Param("name") String name, @Param("productName") String productName, @Param("price") int price);
@NativeQuery("SELECT *
FROM
user u,
product p
WHERE
u.num = p.user_num AND u.num = :userNum
AND product_name = :productName
AND price = :price
AND u.name = :name")
Optional<User> selectUserProduct(@Param("userNum") Long num, @Param("name") String name, @Param("productName") String productName, @Param("price") int price);
보기 좋은 코드라고 하면 당연히 파라미터명을 사용한 코드입니다. 명칭을 하나하나씩 정의해 주는 건 귀찮긴 하지만.. 숫자를 사용하는 방식은 자칫 잘못하면 순서를 잘못 적어 오류가 발생할 수 있고, 이 오류는 찾기까지 오래 걸릴 수도 있습니다.
'Java > Spring' 카테고리의 다른 글
JavaScript -> RestController POST 통신 오류 (1) | 2025.04.24 |
---|---|
Spring boot를 이용한 게시판 만들기 - 등록, 수정, 조회 API 만들기(3) (1) | 2022.06.06 |
Spring boot를 이용한 게시판 만들기 - 유저, 게시물 엔티티 및 리포지토리 만들기(2) (2) | 2022.05.25 |
Spring boot를 이용한 게시판 만들기 - JPA를 이용하여 데이터베이스 연결(1) (2) | 2022.05.17 |
Spring boot에서 Controller가 먹지 않는 에러 (0) | 2022.03.24 |