Spring Data, JPA, Spring Data JPA

박건희·2021년 10월 10일
0

JPA, Spring Data, Spring Data JPA (+ Hibernate)는 무엇이고 서로 어떤 관계일까?
비슷비슷해 보이는 개념들이고, 상속관계나 인터페이스-구현체 관계로 생각해볼 수 있는 위 개념들을 알아보자.

Spring Data

Spring Data는 다양한 data-stores(RDB, NoSQL DB/map-reduce/cloud-based..)를 위한 일관된 data access layer를 제공한다.
Abstraction : 추상체!

  • 어떠한 저장소라도 표준을 준수하는 base repository 와 표준을 준수하는 여러 하위 프로젝트로 구성된 Umbrella project 이다.
  • 사용할 저장소에 맞는 repository 인터페이스를 상속하여 data access를 할 수 있다.

주요 모듈
Spring Data Commons : 모든 spring data module의 주요 컨셉
Spring Data JDBC/JPA/KeyValue/MongoDB/Redis/REST ...

JPA : Java Persistence API

JDBC API의 한계

JDBC API를 이용하면 실제 DB에 맞는 쿼리문을 프로그래머가 직접 작성해야 한다.
-> DB에 종속적인 쿼리를 작성해야 하는데, 다른 DB로의 migration시 다시 쿼리문을 작성해야하는 문제가 있다. 또, 복잡한 쿼리문을 작성하다 보면 실수할 확률이 높아질 수 있다.

JPA란?

ORM(Object-Relation Mapping)기술을 Java에서 사용할 수 있도록 제공하는 인터페이스.

JPA를 사용하면?

Java Persistence API는 다양한 DB에 대해 일관된 접근(인터페이스)을 제공한다.
POJO와 DB table을 mapping 해줘서 프로그래머는 DB와 mapping된 Entity라는 객체만 다루고 쿼리문 사용은 JPA API를 호출하기만 하면 된다.

  • persistentence : 영속. 자바 객체로만 있는게 아니라 실제 DB 테이블와 mapping!

ORM : Object Relational Mapping

Entity는 객체와 DB object를 mapping하는 기술을 ORM이라 한다. Hibernate나 EclipseLink가 ORM을 해주는 JPA implementation의 대표적인 예이다. ORM은 객체-object를 mapping하고, JPA API call에 맞는 native query를 생성한다.

  • ORM vs Query Mapper
    • ORM
      • Object <-- mapping --> DB 레코드
      • 객체를 통해 DB 레코드를 다룬다.
      • JPA API를 호출하면 object와 method에 해당하는 쿼리를 생성해준다.
      • JPA 구현체 : Hibernate, EclipseLink..
    • Query Mapper
      • Object <-- mapping --> Query
      • 쿼리를 직접 작성하여 DB manipulation
      • JDBC template, Mybatis(Xml)

프로그래머는 DB insert를 하기 위해 객체를 생성하여 save 메소드의 인자로 넣어 호출하고, DB로 부터 query한 결과는 다시 객체나 객체 리스트로 받게 된다.

JPA의 구현체

대표적으로 Hibernate가 있다.

Spring Data JPA

Spring Data(Repository <- CurdRepository <- PaginAndSortingRepository) +
JPA를 Spring framework에서 쉽게 이용할 수 있도록 해주는 기능.

JPA를 한번 더 추상화한 인터페이스.

  • 제공 기능
    • 쿼리 메소드
      • @Query annotaion으로 기본 제공 쿼리 외의 쿼리 정의
      • 메서드 이름만으로 JPQL 쿼리 생성(App 로딩 전)
      • 에러가 있다면 런타임에 발견하는 문제
    • Querydsl
      • JPQL(문자열)이 하지 못하는 type-checking이 가능
      • Java 코드 : Builder를 이용하여 쉽게 작성 가능

참고1
참고2
Spring JPA vs JPA vs Hibernate

0개의 댓글