-
<Spring Boot> queryMethodSpring Boot 2023. 8. 25. 14:55
queryMethodspring 에서는 다양한 형태의 쿼리를 진행 할 수 있도록 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 할 수 있는 것을
확인 하실 수 있습니다
'Spring Boot' 카테고리의 다른 글
< Spring Boot > ThymLeaf (0) 2023.08.30 <Spring Boot> queryAnnoation (0) 2023.08.25 < Spring Boot > Repository (0) 2023.08.25 < Spring Boot > Entity (0) 2023.08.25 <Spring Boot> Controller (Rest) (0) 2023.08.24