일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- with recursive
- 백준
- 백준 19238
- 웹어플리케이션 서버
- 프로그래머스
- 백준 16719
- spring security
- Kotlin
- java
- MSA
- 프로래머스
- spring cloud
- 백준 17626
- re.split
- Coroutine
- MySQL
- spring oauth
- Spring
- 백준 파이썬
- 백준 16236
- JPA
- Spring Boot
- 백준 16235
- 백준 15685
- springboot
- sql 기술면접
- java 기술면접
- JVM
- 파이썬
- 백준 17779
- Today
- Total
시작이 반
[JPA] JpaRepository 본문
Spring 입문한 사람이 작성한 글입니다... 잘못된 내용이 있을 수 있습니다..
Spring DB접근 기술
JDBC Template, JPA, Spring Data JPA등 이 있다.
이번 글에서는 Spring Data JPA에 대해서 작성
우선 스프링 부트와 JPA만을 사용해도 개발 생산성이 많이 증가하고, 개발해야할 코드도 줄어든다.
여기에 Spring Data JPA를 사용하면 리포지토리의 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있다.
그리고 반복해서 작성해야 했던 CRUD기능도 Spring Data JPA가 모두 제공한다.
하지만 JPA부터 학습하고 Spring Data JPA를 학습하는 것이 좋다.
사용법
public interface BookRepository extends JpaRepository<Book, Long> {
}
JpaReository를 extends를 하면 해당 인터페이스는 구현체를 자동으로 만들어 스프링 빈에 등록한다.
org.springframework.data.repository.Repository를 상속한 interface 클래스는 @Repository Annotation을 생략해도 Spring 로딩시 자동으로 Repository로 등록 한다.
<>안에는 Entity 클래스 이름과 ID 필드 타입이 지정된다.
기본기능
CrudRepository
이름 | 설명 |
save | 엔티티를 저장하는 메서드 |
saveAll | 엔티티 전체를 저장하는 메서드 |
findById | Id값을 이용하여 엔티티를 검색하는 메서드 |
findAll | entity전체를 검색하는 메서드 ( 전체조회 주의) |
findAllById(Iterable<ID> ids) | Ids 를 이용하여 entity 전체를 가져옵니다. 여기서 ID는 위 레파지토리에서 정의한 Long 입니다. |
count | 엔티티의 개수를 반환하는 메서드 |
deleteById | id를 이용하여 entity를 삭제합니다. |
delete | entity 를 삭제합니다. |
deleteAll | 모든 entity를 삭제합니다. (위험) |
PagingAndSortingRepository
이름 | 설명 |
findAll (Sort sort) | sorting 조건을 걸어 전체 entity를 가져옵니다. |
findAll(Pageable pageable) | paging 조건을 걸어 전체 entity를 가져옵니다. |
JpaRepository
이름 | 설명 |
flush | 영속성 컨텍스트의 변경 사항들과 DB의 상태를 동기화합니다. ( 컨텍스트를 비우는 작업이 아닙니다.) |
saveAndFlush | 엔티티를 저장하고 flush도 같이 진행합니다. ( 명확하게 말하면 조금 지연된 flush를 하긴합니다.) |
deleteInBatch | entity 리스트를 제거합니다. 단 차이가 있다면 where절을 통해 제거됩니다. delete from account where id=? or id=? ... id=? |
deleteAllInBatch | Entity전체를 삭제합니다. ( 단 deleteAll과 다르게 동작합니다.) |
getOne | id를 이용하여 Entity한개를 조회합니다. |
위의 기본 기능을 제외한 조회 기능을 추가하기 위해서는 규칙에 맞는 메소드를 추가해야 한다.
규칙 | 설명 |
findBy로 시작 | 쿼리를 요청하는 메서드 임을 알림 |
countBy로 시작 | 쿼리 결과 레코드 수를 요청하는 메서드 임을 알림 |
위의 findBy에 이어 해당 Entity 필드 이름을 입력하면 검색 쿼리를 실행한 결과를 전달한다.
메서드의 반환형이 Entity 객체이면 하나의 결과만을 전달하고, 반환형이 List라면 쿼리에 해당하는
모든 객체를 전달한다.
Query 메소드에 포함할 수 있는 키워드 (이외에도 여러 키워드가 있음)
docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query
메서드 이름 키워드 | 샘플 | 설명 |
And | findByEmailAndUserId(String email, String userId) | 여러필드를 and 로 검색 |
Or | findByEmailOrUserId(String email, String userId) | 여러필드를 or 로 검색 |
Between | findByCreatedAtBetween(Date fromDate, Date toDate) | 필드의 두 값 사이에 있는 항목 검색 |
LessThan | findByAgeGraterThanEqual(int age) | 작은 항목 검색 |
GreaterThanEqual | findByAgeGraterThanEqual(int age) | 크거나 같은 항목 검색 |
Like | findByNameLike(String name) | like 검색 |
IsNull | findByJobIsNull() | null 인 항목 검색 |
In | findByJob(String … jobs) | 여러 값중에 하나인 항목 검색 |
OrderBy | findByEmailOrderByNameAsc(String email) | 검색 결과를 정렬하여 전달 |
만약에 사용자 정의 메소드를 구현하고 싶다면 따로 interface를 작성한다.
사용자 정의 Repository Interface
public interface CustomProductRepository{
public List<Product> findCustomProduct;
}
인터페이스 구현
public class CustomProductRepositoryImpl implements CustomProductRepository{
public List<Product> findCustomProduct(){
.....
}
}
JpaRepository에 따로 작성한 interface를 상속 한다.
public interface ProductRepository extends JpaRepository<Product, String>, CustomProductRepository
}
참고
- m.blog.naver.com/PostView.nhn?blogId=hankk20&logNo=221542810406&proxyReferer=https:%2F%2Fwww.google.com%2F
- jobc.tistory.com/120
- duooo-story.tistory.com/46
'Programming > JPA' 카테고리의 다른 글
[JPA] 변경감지와 병합(merge) (1) | 2021.05.27 |
---|---|
[JPA] DTO, Domain(Entity) (0) | 2021.02.19 |
[JPA] 연관관계 (0) | 2021.02.18 |
[JPA] Paging (0) | 2021.02.05 |
[JPA] List<DTO> to List<Entity> (DTO, Entity) (0) | 2021.02.01 |