[Spring] SpringDataJPA
SpringDataJPA
스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트이다.
쿼리를 짜는데 집중하는 시간을 줄이고 어플리케이션 코드, 객체를 어떻게 매핑시키고 엔티티를 어떻게 다루는지 객체를 설계하고 개발하는데 많은 시간을 쓸 수 있게한다.
쿼리 지향 개발이 아닌 객체 지향 개발이 가능하도록 도와준다.
AutoConfiguration 지원
데이터 소스 및 엔티티 매니저, 트랜잭션 매니저 설정을 자동으로 해준다.
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:~/order;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
jpa:
open-in-view: false
hibernate:
ddl-auto: create-drop
show-sql: true
properties:
hibernate.format_sql: true
데이터 저장 계층 인터페이스 제공
데이터 저장계층에 대한 인터페이스를 지원해줘서 CRUD 작업을 편리하게 할 수 있다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface OrderRepository extends JpaRepository<Order, String> {
}
@Test
void JPA_query() {
Order order = orderRepository.findById(uuid).get(); // SELECT * FROM orders WHERE id = ?
List<Order> all = orderRepository.findAll(); // SELECT * FROM orders
orderRepository.existsById(uuid);
}
// 실행결과
Hibernate: select order0_.id as id1_3_0_, order0_.member_id as member_i5_3_0_, order0_.memo as memo2_3_0_, order0_.order_datetime as order_da3_3_0_, order0_.order_status as order_st4_3_0_ from orders order0_ where order0_.id=?
Hibernate: select order0_.id as id1_3_, order0_.member_id as member_i5_3_, order0_.memo as memo2_3_, order0_.order_datetime as order_da3_3_, order0_.order_status as order_st4_3_ from orders order0_
Hibernate: select count(*) as col_0_0_ from orders order0_ where order0_.id=?
- findById
- findAll
- existById
- ...
메소드 쿼리
기본적으로 제공하는 메소드 이외의 쿼리를 만들고 싶은 경우 메소드 쿼리를 사용한다.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
- 명시된 키워드들을 사용해서 메소드 이름으로 쿼리를 만들 수 있다.
public interface OrderRepository extends JpaRepository<Order, String> {
List<Order> findAllByOrderStatus(OrderStatus orderStatus);
// SELECT * FROM orders WHERE order_status = 'OPEND'
List<Order> findAllByOrderStatusOrderByOrderDatetime(OrderStatus orderStatus);
// SELECT * FROM orders WHERE order_status = 'OPEND' ORDER BY order_datetiem
}
public interface OrderRepository extends JpaRepository<Order, String> {
List<Order> findAllByOrderStatus(OrderStatus orderStatus);
// SELECT * FROM orders WHERE order_status = 'OPEND'
List<Order> findAllByOrderStatusOrderByOrderDatetime(OrderStatus orderStatus);
// SELECT * FROM orders WHERE order_status = 'OPEND' ORDER BY order_datetiem
}
커스텀 쿼리
쿼리 애노테이션을 사용하여 쿼리를 작성할 수가 있다.
public interface OrderRepository extends JpaRepository<Order, String> {
...
@Query("SELECT o FROM Order AS o WHERE o.memo LIKE %?1%")
Optional<Order> findByMemo(String memo);
}
@Test
void NAMED_QUERY() {
Optional<Order> order = orderRepository.findByMemo("부재시");
Order entity = order.get();
log.info("{}", entity.getMemo());
}
// 실행 결과
Hibernate: select order0_.id as id1_3_, order0_.member_id as member_i5_3_, order0_.memo as memo2_3_, order0_.order_datetime as order_da3_3_, order0_.order_status as order_st4_3_ from orders order0_ where order0_.memo like ?
2021-09-11 15:46:04.524 INFO 19811 --- [ main] c.k.l.domain.order.OrderRepositoryTest : 부재시 전화주세요.
QueryDSL
Builder 패턴 식으로 객체 체이닝 방식으로 쿼리를 작성할 수 있는 툴이다. 네이티브 쿼리를 짤 때 많이 사용한다.
Querydsl - Unified Queries for Java
Unified Queries for Java. Querydsl is compact, safe and easy to learn. <!-- Querydsl Unified Queries for Java Querydsl provides a unified querying layer for multiple backends in Java. Compared to the alternatives Querydsl is more compact, safer and easier
querydsl.com