Spring Data
과거의 데이터베이스는 관계형 데이터베이스의 세상이었다. 현재 MongoDB, redis, Couchbase, neo4 j, hadoop 등 다양한 종류의 데이터베이스들이 우후죽순 생겨났다.
스프링 진영에서 이러한 다양한 데이터베이스를 이용해하는 작업 자체가 비슷하기 때문에 더 큰 레벨에서의 추상화를 하였다.
Spring Data는 추상화를 통해 단순히 통합한 것보다 그 이상을 제공한다.
- CRUD + 쿼리
- 동일한 인터페이스
- 페이징 처리
- 메서드 이름으로 쿼리 생성
Spring Data JPA
순수 JDBC -> JdbcTemplate -> Mybatis -> JPA로 넘어가게 되면서 수많은 데이터 접근 기술의 발전을 이루었다.
이번에는 Spring Data JPA가 등장했다.
기존 JPA를 사용할 때도 SQL 관련 코드의 양이 적었지만 Spring Data JPA가 제공해주는 여러 인터페이스를 사용하면 구현체를 프락시를 통해 자동 생성해주기 때문에 많은 코드가 준다.
만약 이를 적용하기 위해서는 많은 기술에 대한 이해가 뒷받침되어야 한다.
Hibernate, JPA, 데이터베이스 설계 등등..
또한 JPA를 도입하기전에 반드시 숙지해야 하는 부분이 존재한다.
메서드를 통해 만들어지는 JPQL이나 본인이 작성한 JPQL이 어떤 쿼리로 생성될지 이해해야 하고 즉시, 지연 로딩 전략을 이해해야 한다. 이외에도 영속성 콘텍스트, 변경 감지, 언제 영속성 콘텍스트가 플러쉬 되는지, 연관관계 매핑의 이해, JPQL의 한계 등 다양한 전문적인 지식의 학습이 필요하다.
Spring Data 및 Spring Data JPA의 대표적인 기능은 공통 인터페이스 기능이다.
다음으로는 쿼리 메소드 조건이다.
기존 JPA를 사용함에 있어 jpql을 직접 작성해야 하는 부분을 메서드 이름으로 자동 생성해주는 기능이다.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result
자동 생성에 따라 쿼리를 자동 생성하는 것도 좋지만 만약 파라미터가 매우 많은 경우에는 쿼리를 직접 작성할 수 있다.
@Query
("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price")
Integer price);
}
참고로 스프링 데이터 JPA는 JPQL뿐만 아니라 JPA의 네이티브 쿼리 기능도 지원하여 SQL을 직접 작성할 수 도 있다.
public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
List<Item> findByItemNameLike(String itemName);
List<Item> findByPriceLessThanEqual(Integer price);
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);
}
다만 스프링 데이터 JPA도 동적쿼리에 대한 지원은 미흡하다.
Example이라는 기능으로 약간의 동적쿼리를 지원하긴 하지만 실무에서 사용하기에는 기능이 빈약하다.
따라서 실무자들은 Querydsl을 사용해 동적쿼리를 처리하는 편이다.
스프링 데이터 JPA는 이 외에도 정말 수 많은 편리한 기능을 제공한다. 심지어 우리가 어렵게 사용하는 페이징을 위한 기능들도 제공한다.
오늘은 간단히 스프링 데이터 JPA에 대한 기본 기능과 개념에 대해 살펴봤다.
이후에는 실제 실무에서 스프링 데이터 JPA를 사용할 때 어떤 개념을 알아야 하고 무엇을 조심해야 하는지 각 파트별로 나누어서 공부할 예정이다.
'Spring|Spring-boot > Spring-Data-JPA' 카테고리의 다른 글
Custom Repository (0) | 2022.11.30 |
---|---|
JPA Hint & Lock (0) | 2022.11.27 |
@EntityGraph (0) | 2022.11.27 |
벌크성 수정 쿼리 (0) | 2022.11.27 |
스프링 데이터 JPA (0) | 2022.11.26 |
댓글