Spring Boot

<Spring Boot> queryMethod

98kg 2023. 8. 25. 14:55

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 할 수 있는 것을

확인 하실 수 있습니다