Spring Data JPA - 쿼리 메소드 기능
쿼리 메소드
책을 보면서 하던 중 책에서 JpaRepository를 상속받은 리포지토리 안에 그저 메소드하나 생성한 것 뿐인데 그 메소드가 쿼리로서 기능을 하길래 내가 지나친 것이 있는가 싶었는데, Spring Data JPA는 인터페이스에 메서드만 적어두면 메서드 이름을 분석해서 적절한 JPQL 쿼리를 자동으로 만들고 실행해주는 기능을 제공한다.
그리고 별도로 Spring Data JPA가 제공하는 쿼리 메소드 기능 @Query 어노테이션을 사용해서 리포지토리 인터페이스에 쿼리 직접 정의하는 다른 방법이 있다.
메소드 이름으로 쿼리 생성
방법은 위에 적었다시피 JpaRepository를 상속받은 인터페이스 리포지토리 안에 자신이 작성하고 싶은 쿼리를 메소드 이름으로 작성하면 되는데 그렇다고 마음대로 작성하는 것이 아니라 규칙에 따라 작성을 해야 한다.
예를 들어 Reply 엔티티가 FK(외래키)로 Board를 참조하고 있는 ManyToOne 연관관계이며, Board의 PK(기본키)값으로 Reply 의 특정 데이터를 삭제하고 싶다면 밑의 코드처럼 구성할 수 있을 것이다.
1
2
3
4
public interface ReplyRepository extends JpaRepository<Reply, Long> {
void deleteByBoard_Bno(Long bno);
}
그리고 정말 메소드 이름만으로 쿼리 기능을 작동하는지 테스트 코드를 작성해서 실행해서 결과를 보면 제대로 삭제하고자 하는 기능이 정삭적으로 작동된다.
메소드 이름 규칙
메서드의 규칙 구조는 크게 리턴타입 Subject(주제) + Predicate(조건)의 형태를 갖는다.
위의 코드를 뜯어보자면 delete(주제)+By+Board_Bno(조건-지정한 칼럼명)+(Long bno)(지정한 매개변수) 이런 구조 일 것이다. 이외에도 많은 기능이 있다.
- Select : find___By, read___By, query___By, get__By -> 조회 기능
- Count : count__By , (long 반환) -> 찾고자 하는 데이터 개수 반환 기능
- Exits : exists__BY, (boolean 반환) -> 존재 여부 기능
- Delete : delete__By, remove__By (long 반환) -> 삭제 기능
- Distinct : findDistinctBy___ -> 중복 제거 기능
- Limit : findFirst3, findFirst, findTop, findTop3 -> 상위 n개의 데이터 리턴 기능
더 자세한 것은 공식사이트를 참조하자. spring