Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Linux
- html
- VCS
- Elk
- javascript
- cache
- r
- mybatis
- reactor
- redis
- github
- mongodb
- libuv
- reactive
- Heap
- socket
- Java
- Static
- ajax
- git
- NoSQL
- nodejs
- AWS
- network
- spring
- 네트워크
- HTTP
- effective
- 데이터통신
- Lombok
Archives
- Today
- Total
빨간색코딩
Spring Data JPA 살펴보기 (JpaRepository, Bean으로 만들어지는 원리, 메소명으로 쿼리 만들기) 본문
- 참조문서
1. 개요
- Repository 추상화를 통해 interface 선언만으로도 JPA 사용 가능
- 만약, Spring Data JPA 를 사용하지 않는다면, javax.persistence 패키지의 EntityManager 를 사용하거나 JPQL을 이용해서 쿼리를 날렸어야 했음.
- JpaRepository<T, ID> 상속
- 메소드 이름으로 쿼리 생성 지원
- 이외에도 다양한 지원(페이징, 정렬, 도메인 클래스 변환)
2. JpaRepository<T, ID> 살펴보기
- JpaRepository는 CrudRepository, PagingAndSortingRepository 등을 상속받음
- <S extends T> S save(S entity) : insert/update
- T findOne(ID id) : select
- long count() : count
- void delete(ID id) : delete
2-1. JpaRepository 상속한 인터페이스가 Spring Bean 에 어떻게 등록될까?
- 인터페이스 타입의 인스턴스는 누가 만들어 주는것인가? (Impl 도 없는데..)
- JpaRepository 를 상속받은 클래스는 Autowired 처럼 DI 되는것도 아닌 것 같고, 구현체를 정의한 적도 없는데, 해당 타입의 Bean 이 만들어지고 등록된다. 어떻게 가능한 것인지?
- 리플렉션 패키지 내부의 Proxy 클래스를 활용한다. 이것을 사용하기 쉽게, 스프링AOP 는 ProxyFactory 로 추상화해서 만들어두었음.
- 아래 spring data JPA는 아래의 RepositoryFactorySupport 를 사용해서, Proxy 객체를 bean 으로 등록한다.
public abstract class RepositoryFactorySupport implements BeanClassLoaderAware, BeanFactoryAware {
public <T> T getRepository(Class<T> repositoryInterface, RepositoryFragments fragments) {
// Create proxy
ProxyFactory result = new ProxyFactory();
result.setTarget(target);
result.setInterfaces(repositoryInterface, Repository.class, TransactionalProxy.class);
// 생략...
}
}
3. 메소드이름으로 쿼리 자동생성
- https://docs.spring.io/spring-data/jpa/docs/2.5.2/reference/html/#repository-query-keywords
- 이름 규칙에 맞춰 interface 메소드를 선언하면 자동으로 쿼리를 생성해줌
- ex1) findByItemNameLike(String itemName) : SELECT * FROM item WHERE itemName LIKE '%{itemName}';
- ex2) deleteByPriceBetween(int price1, int price2) : DELETE FROM item WHERE price BETWEEN {price1} AND {price2};
5. 페이징
- Pageable : Spring Data 에서 제공하는 web support 중 하나
- 페이지네이션에 필요한 정보들을 추상화
- 컨트롤러에 인자로 추가 후 JpaRepository로 전달
6. 복잡한 쿼리 작성
- JPQL : 엔티티 객체를 조회하는 객체 지향 쿼리
- Criteria API : JPQL을 생성하는 빌더 클래스
- 써드파티 라이브러리
- QueryDSL
- JOOQ
'Spring' 카테고리의 다른 글
[스프링배치 완벽가이드] 2장 스프링 배치 (0) | 2021.08.18 |
---|---|
[스프링배치 완벽가이드] 1장 배치와 스프링 (0) | 2021.08.18 |
Spring Event와 SSE 로 리액티브하게 접근하기 (EventListener, Server-Sent Events, 비동기 컨트롤러, RxJava로 동일하게 재구현) (1) | 2020.12.31 |
Reactive와 Spring 4 (C10K, 리액티브 선언문, 리액티브 스프링 등장 전) (0) | 2020.12.30 |
spring webflux와 armeria 살펴보기 (Mono, Flux, gRPC, Thrift) (0) | 2020.06.19 |
Comments