---
# System prepended metadata

title: Spring Data JPA
tags: [' spring-data', jpa]

---

---
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 메소드 들은 다음과 같이 이미 다양하게 만들어져 있다.

![](https://i.imgur.com/m9wZPAs.png)

사용하기 위해서는 의존성을 추가 해야 한다.
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 를 상속 받고 있다.
구조도는 다음과 같다.
![](https://i.imgur.com/AgUmlVS.jpg)
> Spring Data 모듈은 JPA 외에 카산드라, 몽고DB, 엘라스틱서치 등이 있다
> https://spring.io/projects/spring-data 참고.

사용할수 있는 메소드도 좀더 많아지는데, 다음을 참고 하면 된다.
![](https://i.imgur.com/LL6jJkP.jpg =70%x70%)




## 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 ?
```


