<Spring Boot> queryMethod
queryMethod
spring 에서는 다양한 형태의 쿼리를 진행 할 수 있도록 ORM 을 두고있다.
지금 볼 내용은 Spring JPA 에서 제공하는 쿼리 메서드이다.
즉 메서드 자체가 쿼리로 구성되어진다는 말이다.
이 쿼리 메서드는 다양하게 구성되어지는데, 문서를 참조해서 활용 시 이용하기.
대표인 예만 설명하겠습니다
원리
Repository 에 쿼리 메서드를 선언한다.
이때 쿼리 메서드가 리턴하는 리턴 타입도 같이 명기한다,
쿼리 메서드는 규칙이 존재하기 때문에 해당 규칙을 문서에서 확인 해야합니다.
쉽게 생각하면 이렇습니다.
리턴타입 쿼리 메서드 : 쿼리메서드는 엔티티를 대상으로 쿼리 시 사용하는 다양한 조건문등을 구성하는 원리입니다.
ex) List<Entity> 엔티티 대상으로 글 넘버 기준으로 start ~ end 까지를 조회하도록 할 경우
List<Entity> findByPKName 조회조건키워드 (문서참조) 정렬기준 (p1(start row), p2(end row))
우선 repository에 작성한 메서드를 보여드리겠습니다.
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import comfullstack2.ph1.entity.Memo;
import jakarta.persistence.Entity;
public interface MemoRepository extends JpaRepository<Memo, Long>{
List<Memo> findByMnoBetweenOrderByMnoDesc(Long start,Long end);
// 제네릭에 Memo 라는 Entity를 걸어주고 테이블에 Pk 값인 Mno를 기준으로 Desc 해주는 메서드
// 파라미터로는 Long 타입에 mno 의 num 값을 start, end 값으로 준다.
}
그리고 나서 test 파일에서 테스트 해보겠습니다,
package comfullstack2.ph1;
import static org.mockito.ArgumentMatchers.nullable;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.util.List;
import java.util.Optional;
import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import comfullstack2.ph1.entity.Memo;
@SpringBootTest
class Fullst2springDb1ApplicationTests {
@Autowired
MemoRepository memoRepository; // 인터페이스 타입에 bean를 생성한다,
@Test
void queryMethodEx() {
List<Memo>result = memoRepository.findByMnoBetweenOrderByMnoDesc(50273L,50283L);
result.forEach(t -> System.out.println(t));
}
}
실행결과
또 다르게 pageable 을 이용한 코드를 보여드리겠습니다.
public interface MemoRepository extends JpaRepository<Memo, Long >{
List<Memo> findByMnoBetween(Long start,Long end); // 쿼리 자체와 pageable 을 사용하는 방법
Page<Memo> findByMnoBetween(Long start,Long end,Pageable pageable); // page 를 리턴
}
page 타입에 findByMniBetween 메서드를 만들어 오버라이드 해줍니다.
import static org.mockito.ArgumentMatchers.nullable;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.util.List;
import java.util.Optional;
import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import comfullstack2.ph1.entity.Memo;
@SpringBootTest
class Fullst2springDb1ApplicationTests {
@Autowired
MemoRepository memoRepository; // 인터페이스 타입에 빈즈를 생성한다,
@Test
void queryMethodEx() {
//List<Memo>result = memoRepository.findByMnoBetween(50273L,50283L);
Pageable pageable = PageRequest.of(0, 10,Sort.by("mno").descending());
Page<Memo> result = memoRepository.findByMnoBetween(50273L,50293L, pageable);
result.get().forEach(System.out::println);
}
}
Pageable 을 리턴하므로 Pageable 타입에 변수를 만들고 pageRequest.of() 를 이용해 decending 해줍니다
그 후 메서드를 호출하여 실행하면 다음과 같은 결과가 나옵니다
실행결과
보시다시피 같은 결과가 출력되는 것을 확인 하실 수 있습니다.
이와 같이 queryMethod 를 이용하면 DB에 있는 데이터들을 이용하여 바로바로 ORCD 할 수 있는 것을
확인 하실 수 있습니다