JPA, Spring Data, Spring Data JPA (+ Hibernate)는 무엇이고 서로 어떤 관계일까?
비슷비슷해 보이는 개념들이고, 상속관계나 인터페이스-구현체 관계로 생각해볼 수 있는 위 개념들을 알아보자.
Spring Data는 다양한 data-stores(RDB, NoSQL DB/map-reduce/cloud-based..)를 위한 일관된 data access layer를 제공한다.
Abstraction : 추상체!
주요 모듈
Spring Data Commons : 모든 spring data module의 주요 컨셉
Spring Data JDBC/JPA/KeyValue/MongoDB/Redis/REST ...
JDBC API를 이용하면 실제 DB에 맞는 쿼리문을 프로그래머가 직접 작성해야 한다.
-> DB에 종속적인 쿼리를 작성해야 하는데, 다른 DB로의 migration시 다시 쿼리문을 작성해야하는 문제가 있다. 또, 복잡한 쿼리문을 작성하다 보면 실수할 확률이 높아질 수 있다.
ORM(Object-Relation Mapping)기술을 Java에서 사용할 수 있도록 제공하는 인터페이스.
Java Persistence API는 다양한 DB에 대해 일관된 접근(인터페이스)을 제공한다.
POJO와 DB table을 mapping 해줘서 프로그래머는 DB와 mapping된 Entity라는 객체만 다루고 쿼리문 사용은 JPA API를 호출하기만 하면 된다.
Entity는 객체와 DB object를 mapping하는 기술을 ORM이라 한다. Hibernate나 EclipseLink가 ORM을 해주는 JPA implementation의 대표적인 예이다. ORM은 객체-object를 mapping하고, JPA API call에 맞는 native query를 생성한다.
프로그래머는 DB insert를 하기 위해 객체를 생성하여 save 메소드의 인자로 넣어 호출하고, DB로 부터 query한 결과는 다시 객체나 객체 리스트로 받게 된다.
대표적으로 Hibernate가 있다.
Spring Data(Repository <- CurdRepository <- PaginAndSortingRepository) +
JPA를 Spring framework에서 쉽게 이용할 수 있도록 해주는 기능.
JPA를 한번 더 추상화한 인터페이스.