---
tags: jpa, spring-data
---
Spring Data JPA
===
## JpaRepository
Spring Data JPA 는 CRUD 를 간편하게 만들수 있게 interface 를 제공 한다.
아래처럼 JpaRepository 를 상속하기만 하면 된다.
```java=
public interface StudentRepository extends JpaRepository<Student, Long> {
List<Student> findByStudy(Study studyId);
}
```
> interface 만 작성해도 되며, 실행시점에 Spring Data JPA 가 앱 기동 시점에 구현체를 주입 한다.
JpaRepository 를 상속만 하면, 사용할수 있는 public 메소드 들은 다음과 같이 이미 다양하게 만들어져 있다.

사용하기 위해서는 의존성을 추가 해야 한다.
artifactId 는 `spring-boot-starter-data-jpa` 이다.
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
```
참고로 책에서는 spring-data-jpa 와 spring-data-commons 를 주입 하라고 했지만
spring-boot-starter-data-jpa 안에 둘다 들어 있다. Spring Boot 의 장점이다.
또한 starter 모듈들은 별도로 버전명을 명시하지 않아도 된다.
Spring Boot 버전에 따라 적절한 버전을 넣어주기 때문이다.
당연히 하위모듈과의 궁합도 좋을것이다.
> 개인적인 경험 인데, spring commons 4.1 버전대를, web은 4.0 버전대를 사용하면, commons 의 클래스나 메소드가 없어서 이슈를 겪었던적이 있었다.
## Spring Data 와 Spring Data JPA
Spring Data JPA는 Spring Data 를 상속 받고 있다.
구조도는 다음과 같다.

> Spring Data 모듈은 JPA 외에 카산드라, 몽고DB, 엘라스틱서치 등이 있다
> https://spring.io/projects/spring-data 참고.
사용할수 있는 메소드도 좀더 많아지는데, 다음을 참고 하면 된다.

## Spring Data JPA
### 쿼리메소드
메소드 이름으로 쿼리를 만들수 있고,
```java=
List<Team> findByNameLike(String teamName);
```
위 쿼리메소드를 실행하면 쿼리는 다음과 같이 발생한다.
```
select
team0_.id as id1_1_,
team0_.name as name2_1_
from
team team0_
where
team0_.name like ? escape ?
```