티스토리 뷰

쿼리 메서드는 말 그대로 메서드의 이름 자체가 하나의 쿼리문이 되는 기능이다.

해당 쿼리 메서드의 메서드 명을 지정할 때는 findBy, getBy 등으로 메서드의 이름을 시작하고 칼럼과 키워드를 연결하는 것으로 메서드를 작성한다. 

 

메서드 이름에 대한 Reference는 다음 링크에서 확인할 수 있다.

Keyword-Reference: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io


구현은 다음과 같이 Repository 인터페이스에 해당 메서드를 추상 메서드 형태로 선언하고, 바로 사용하면 끝이다.

 

◎Repository.java(interface)

package com.example.demo.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import com.example.demo.entity.Memo;

public interface MemoRepository extends JpaRepository<Memo, Long> {
	//Memo의 mno 값이 70 ~ 80 사이의 객체들을 조회하고, mno의 역순으로 정렬할 수 있는 쿼리 메서드
	List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}

 

◎test.java

package com.example.demo.repository;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.demo.entity.Memo;

@SpringBootTest
public class MemoRepositoryTest {

    @Autowired
    MemoRepository memoRepository;
    
    @Test
    public void testQueryMethods() {
    	List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L);
    	for(Memo memo : list) {
    		System.out.println(memo);
    	}
    }
}

그럼 다음과 같이 결과를 확인할 수 있다.


마찬가지로 delete 쿼리도 작성하여 조건에 맞는 객체를 삭제할 수 있지만, deleteBy 메서드를 사용할 때는 반드시

 

@Commit: 자동 Rollback 방지

@Transactional: 예외 발생 방지(javax.persistence.TransactionRequiredException)

 

어노테이션을 사용해야 한다.

 

◎Repository.java(interface)

package com.example.demo.repository;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

import com.example.demo.entity.Memo;

public interface MemoRepository extends JpaRepository<Memo, Long> {
	
	// 특정 조건에 맞는 엔티티 객체를 삭제하는 쿼리 메서드
	void deleteMemoByMnoLessThan(Long num);
}

◎test.java

package com.example.demo.repository;

import java.util.List;

import javax.transaction.Transactional;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;



@SpringBootTest
public class MemoRepositoryTest {

    @Autowired
    MemoRepository memoRepository;
    
    // Memo의 mno가 10 보다 작은 엔티티 객체를 삭제하는 메서드
    @Test
    @Commit
    @Transactional
    public void testDeleteQueryMethods() {
    	memoRepository.deleteMemoByMnoLessThan(20L);
    }
    
}

또한, 쿼리 메서드와 Pageable 객체를 결합하여 사용할 수도 있다.

 

Pageable 에 대한 자세한 설명은 타 블로그에 잘 정리된 내용이 있다.

Pageable: https://jiyongpark-dev.tistory.com/15 

 

Pageable 사용하기

개요 JPA를 이용해서 Paging API를 만들어 보도록 하겠습니다. 페이징 처리는 거의 모든 웹 개발에서 사용하고 있습니다. 그렇게 복잡하고 어려운 구현은 아니나 실제 쿼리로 작성할 때는 상당히 번

jiyongpark-dev.tistory.com

 

◎Repository.java(interface)

package com.example.demo.repository;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

import com.example.demo.entity.Memo;

public interface MemoRepository extends JpaRepository<Memo, Long> {
	//Memo의 mno 값이 70 ~ 80 사이의 객체들을 조회하고, mno의 역순으로 정렬할 수 있는 쿼리 메서드
	List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
	
	//쿼리 메서드와 Pageable을 결합하는 쿼리 메서드
	Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}

 

◎test.java

package com.example.demo.repository;

import java.util.List;

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 org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import com.example.demo.entity.Memo;

@SpringBootTest
public class MemoRepositoryTest {

    @Autowired
    MemoRepository memoRepository;
    
    @Test
    public void testQueryMethods() {
    	List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L);
    	for(Memo memo : list) {
    		System.out.println(memo);
    	}
    }
    
    // 쿼리 메서드와 Pageable 결합
    // Memo의 mno 값이 10 ~ 50 사이의 객체를 조회하고,
    // 그 중에 첫 페이지에 해당하는 10개의 객체를 mno 를 기준으로 역순 정렬
    @Test
    public void testQueryMethodWithPageable() {
    	Pageable pageable = PageRequest.of(0, 10, Sort.by("mno"));
    	Page<Memo> result = memoRepository.findByMnoBetween(10L, 50L, pageable);
    	result.get().forEach(memo -> System.out.println(memo));
    }
    
}
Comments