[Spring] Query Method

HOJUN·2024년 6월 12일

Backend - Spring

목록 보기
20/34

Query

Quert는 데이터베이스에 특정 정보를 요청하는 것이다.
질의라고도 하며 정보를 검색하기 위한 작성문이다.

쿼리를 작성하기 위해서는 SQL이라는 언어를 학습해야하고, 생각보다 새로 익히기 쉽지 않은 구조로 이루어져있다.

JPA에서는 Query Method를 사용해서 JpaRepository의 상속만으로 쿼리를 작성하는 것처럼 동작시킬 수 있다.

min과 max값 사이의 점수만 출력하도록 하는 쿼리를 작성해보자

SELECT * from user 
where 
score >= min
AND 
score <= max

보기 쉽도록 의미단위로 잘랐다.

user 테이블에서 모든( * ) 데이터 중
특정 조건(where)을 성립하는 데이터를 검색하도록 작성했다.
그 조건은 min <= score <= max 인 score를 가지는 데이터이다.

하지만 JPA에서는 쿼리를 작성하지 않고 메소드 호출로 같은 동작을 수행하는 것처럼 코드를 작성할 수 있다.

public List<UserEntity> findAllByScoreGreaterThanEqualAndScoreLessThanEqual(int min, int max);

JpaRepository 를 상속하는 UserRepository에 위와 같은 메소드를 선언한다.

public List<UserEntity> filterScore(int min, int max) {
	return userRepository.findAllByScoreGreaterThanEqualAndScoreLessThanEqual(min, max);
}

UserService에서 해당 메소드를 파라미터와 함께 호출하는 메소드를 구현하고

@GetMapping("/min_max")
public List<UserEntity> filterScore(
        @RequestParam int min,
        @RequestParam int max
){
    return userService.filterScore(min, max);
}

Controller 부분에서 GET 매핑 요청 메소드를 작성한다.

현재 user 테이블의 전체 데이터는 다음과 같고, 250 <= score <= 400의 데이터를 추출하도록 해보자


성공적으로 응답을 내렸고, 실행로그 하단에 쿼리문이 출력된 것을 볼 수 있다.

파라미터로 전달된 부분을 값으로 입력하고 실제 쿼리를 데이터베이스에 날려보면 같은 데이터를 추출한 것을 볼 수 있다.

Query Method

Query Method는 특정 조건으로 쿼리를 파싱한다.

findAllByScoreGreaterThanEqualAndScoreLessThanEqual(int min, int max)

위 메소드 이름에서find ~ By를 Subject라고 하고 그 뒤의 부분을 Predicate라고 한다.
subject에서 select 쿼리를 작성하는 메서드가 만들어진다.
predicate에서 Camel case로 단어를 쪼개면서 필드를 찾고 의미를 파싱하게 된다.

실제로 위 메소드는
findAllBy -> predicate 의 데이터를 모두 반환하고

Score/GreaterThanEqual/And/Score/LessThanEqual(int min, int max)

위 단위로 파싱하는데, 필드로 나타나는 Score를 파라미터 min과 max의 등장 순서대로 매칭하고
나머지 의미단위는 정해진 로직에 의해서 쿼리문에 매칭된다. 아래 링크에서 모든 메소드를 확인할 수 있다.
Spring Data JPA Reference

findAllBy -> select * from user 

Score/Score -> min/max

GreaterThanEqualAndLessThanEqual -> ?? >= min and ?? <= max

정리하자면 위와 같이 매칭된다고 생각할 수 있겠다.

0개의 댓글