Spring/Spring Boot

[Spring] JPA의 이해(JPA, Hibernate)

민돌v 2021. 12. 29. 02:02

순서

1. JPA란

2. ORM이란

3. JPA 구조 - 하이버네이트

4. JPA 와 Spring data JPA 의 차이

5. Spring Data JPA 키워드


 

1. JPA란

JPA 는 Java Persistence(영속성) API 입니다.
여기서 Persistence란, 사전적 의미로 "영속성"을 의미하며, 데이터가  (없어지지 않고 오랜동안) 지속됨을 의미합니다.
 
  • 램은 휘발성 데이터를 저장 - 컴퓨터가 꺼지면 사라짐
  • 데이터가 날라가지 않도록 -> 하드디스크에 저장하면 안 사라짐
  • => 이게 퍼시스턴스(영구히 기록)
 
다시 JPA란,
Java Persitance API 는 "자바에서 데이터를 영구히 기록할 수 있는(DBMS에) 환경을 제공하는 API" 라고 말할 수 있다.

 

여기서 API는,
애플리케이션(Apllication) -> 프로그램
프로그래밍(Programming) -> 프로그래밍
인터페이스(Interface) -> 인터페이스
 
➡️ 인터페이스를 통해 프로그래밍하여 프로그램을 만듬

 

API란 "인터페이스(어떤 약속)을 토대로 요청에 대한 응답을 제공해주는 프로그램"정도로 이해할 수 있다.

 

다시다시 JPA를 풀어서 설명하면..!!
JAVA 
Persistence
Application Programming Interface 

 

JPA는 자바 프로그램을할 때 영구적으로 데이터를 저장하기위해 필요한 인테페이스를 제공해주는 것

 


 

2. ORM이란

JPA는 ORM 기술입니다.

 

ORM(Object Relational Mapping)이란,

객체를(Object)와 데이터베이스의 데이터를 연결해주는(매핑) 기술이다.

 

쉽게 말하자면, ORM의 역할을 설명하면서 이해할 수 있다.

DB 데이터와 JAVA에서의 데이터 타입이 다르기 때문에, DB의 데이터를 JAVA에서 사용하기 위해서, Object를 만들어야하는데, 이를 모델링이라고 한다.

 

DB에서 데이터를 받기위해, JAVA에서 코드, 즉 모델링을 통해 객체에 데이터를 받아올 수 있다.

반대로 자바에서 객체 코드를 이용해서 DB 데이터 테이블을 생성할 수 있는데, 이를 자동으로 해주는게 ORM이다.  

코드와 실제 데이터의 매핑

 

ORM 없이 DataBase의 데이터를 조작하기 위해서는 아래의 일련의 과정을 통해야한다.

DB 데이터 생성 과정

 이런 일련의 작업(CRUD)를 ORM에서 자동으로 제공해준다!!

 


3. JPA의 구조

JPA는 특정기능을 제공하는 라이브러리가 아닌, 인터페이스입니다.

그저 인터페이스이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현합니다.

https://dbjh.tistory.com/77

 

하이버네이트는 JPA 구현체의 한 종류입니다

하이버네이트 ORM(Hibernate ORM)은, 자바 언어를 위한 객체 관계 매핑 프레임워크로, 객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공합니다.

 

JPA는 DB와 자바 객체를 매핑하기 위한 인터페이스(API)를 제공하고 JPA 구현체(하이버네이트)는 이 인터페이스를 구현한 것입니다.

하이버네이트 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있습니다.

 

 

4. JPA vs Spring Data JPA

 

JPA와 Spring Data JPA는 다르다.

 

그럼 스프링부트에서 사용하는 JPA가 지금까지 말해왔던 JPA일까요?

아닙니다. 스프링부트에서 사용하는 JPA는 Spring Data JPA로, JPA를 더 쉽게 사용하기 위해 스프링에서 제공하고 있는 프레임워크 입니다.

 

 

https://velog.io/@adam2/JPA%EB%8A%94-%EB%8F%84%EB%8D%B0%EC%B2%B4-%EB%AD%98%EA%B9%8C-orm-%EC%98%81%EC%86%8D%EC%84%B1-hibernate-spring-data-jpa

 

JPA 클래스 관계

 

JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계이다.

https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

 

위 사진은 JPA와 Hibernate의 상속 및 구현 관계를 나타낸 것이다.

JPA의 핵심은   EntityManagerFactory,  EntityManager, EntityTransaction이며,  

Hibernate에서는 각각 SessionFactory, Session, Transaction으로 상속받고 각각 Impl로 구현하고 있음을 확인할 수 있다.


Spring으로 개발을 하면서, EntityManager를 직접 사용할일은 거의거의거의 없다. (적어도 나는?)

Spring 부트에서 DB에 접근하기위해 사용할 때는 Repository를 사용했고, 이 레포지토리가 Spring Data JPA의 핵심이라고 한다, 


Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.

이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.

사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.

"Spring Data JPA가 JPA를 추상화했다"는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것이다.

 

 

 

Spring JPA Data Doc에서는?

Spring Data JPA에서는 Repository에서 JPA 인터페이스를 상속받아 아래와 같은 키워드만 있으면

JPA를 통해서 SQL이 자동 생성되어 사용할 수 있습니다.

Keyword Sample snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull, Null findByAge(Is)Null … where x.age is null
IsNotNull, NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

출처 https://docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference/html/#jpa.repositories




 

 

 

 

 


참고

Spring Data JPA에서 Query를 사용하는 방법 : https://sundries-in-myidea.tistory.com/91

JPA vs Spring data JPA / JPA 구현체 : https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/