📢 장정우님이 지음,
[스프링부트 핵심가이드 : 스프링 부트를 활용한 애플리케이션 개발 실무] 책을 읽고 정리한 글입니다.
Spring Data JPA는 JpaRepository를 기반으로 더욱 쉽게 데이터베이스를 사용할 수 있는 아키텍처를 제공한다. 스프링 부트로 JpaRepository를 상속하는 인터페이스를 생성하면 Spring Data JPA가 제공하는 다양한 메서드를 손쉽게 활용할 수 있다.
여기서 이야기하는 리포지토리(Repository)는 Spring Data JPA가 제공하는 인터페이스이다. 엔티티를 데이터베이스의 테이블과 주고를 생성하는 데 사용했다면 리포지토리는 엔티티가 생성한 데이터베이스에 접근하는 데 사용된다.
public interface ProductRepository extends JpaRepository<Product, Long>{
}
ProductRepository가 JpaRepository를 상속받을 때는 대상 엔티티와 기본값 타입을 지정해야 한다. 위 예제와 같이 대상 엔티티를 Product로 설정하고 해당 엔티티의 @Id 필드 타입인 Long을 설정하면 된다.
리포지토리에서는 몇 가지 명명규칙에 따라 커스텀 메서드도 생성할 수 있다. 일반적으로 CRUD(Create, Read, Update, Delete) 에서 따로 생성해서 사용하는 메서드는 대부분 Read 부분에 해당하는 Select 쿼리밖에 없다. 엔티티를 저장하거나 갱신 또는 삭제할 때는 별도의 규칙이 필요하지 않기 때문이다. 다만 리포지토리에서 기본적으로 제공하는 조회 메서드는 기본값으로 단일 조회하거나 전체 엔티티를 조회하는 것만 지원하고 있기 때문에 필요에 따라 다른 조회 메서드가 필요하다.
메서드에 이름을 붙일 때는 첫 단어를 제외한 이후 단어들의 첫 글자를 대문자로 설정해야 JPA에서 정상적으로 인식하고 쿼리를 자동으로 만들어준다. 조회 메서드(find)에 조건을 붙일 수 있는 몇 가지 기능을 소개하면 다음과 같다.
FindBy : SQL문의 where 절 역할을 수행하는 구문이다. findBy 뒤에 엔티티의 필드값을 입력해서 사용한다.
예) findByName(String name)
AND, OR : 조건을 여러 개 설정하기 위해 사용한다.
예) findByNameAndEmail(String name, String email)
Like / NotLike : SQL문의 like와 동일한 기능을 수행하며, 특정 문자를 포함하는지 여부를 조건으로 추가한다. 비슷한 키워드로 Containing, Contains, isContaing이 있다.
StartsWith / StartingWith : 특정 키워드로 시작하는 문자열 조건을 설정한다.
EndsWith / EndingWith : 특정 키워드로 끝나는 문자열 조건을 설정한다.
IsNull / IsNotNull : 레코드 값이 Null 이거나 Null이 나닌 값을 검색한다.
True / False : Boolean 타입의 레코드를 검색할 때 사용한다.
Before / After : 시간을 기준으로 값을 검색한다.
LessThan / GreaterThan : 특정 값(숫자)을 기준으로 대소 비교를 할 때 사용한다.
Between : 두 값(숫자) 사이의 데이터를 조회한다.
OrderBy : SQL 문에서 order by와 동일한 기능을 수행한다.
예) 가격순으로 이름 조회를 수행한다면 List findByNameOrderByPriceAsc(String name);와 같이 작성한다.
countBy : SQL 문의 count와 동일한 기능을 수행하며, 결괏값의 개수(count)를 추출한다.
자세한 쿼리 메서드는 7장에서 다룬다.