순서
1. JPA란
2. ORM이란
3. JPA 구조 - 하이버네이트
4. JPA 와 Spring data JPA 의 차이
5. Spring Data JPA 키워드
1. JPA란
- 램은 휘발성 데이터를 저장 - 컴퓨터가 꺼지면 사라짐
- 데이터가 날라가지 않도록 -> 하드디스크에 저장하면 안 사라짐
- => 이게 퍼시스턴스(영구히 기록)
애플리케이션(Apllication) -> 프로그램
프로그래밍(Programming) -> 프로그래밍
인터페이스(Interface) -> 인터페이스
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의 데이터를 조작하기 위해서는 아래의 일련의 과정을 통해야한다.
이런 일련의 작업(CRUD)를 ORM에서 자동으로 제공해준다!!
3. JPA의 구조
JPA는 특정기능을 제공하는 라이브러리가 아닌, 인터페이스입니다.
그저 인터페이스이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현합니다.
하이버네이트는 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를 더 쉽게 사용하기 위해 스프링에서 제공하고 있는 프레임워크 입니다.
JPA 클래스 관계
JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계이다.
위 사진은 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/
'Spring > Spring Boot' 카테고리의 다른 글
[Spring] API 문서 자동화 1 - Swagger (0) | 2021.12.29 |
---|---|
JPA pageable 페이징 정렬, 외부 참조 엔티티 리스트 개수로 정렬할때 - @Formula (0) | 2021.12.29 |
[Spring] 스프링 부트 페이지네이션 (Query, JPA, offset / cursor 페이지네이션) (2) | 2021.12.23 |
[Spring] 스프링 시큐리티 - 카카오 소셜로그인 하기(OAuth) (4) | 2021.12.04 |
[Spring] 스프링 시큐리티 사용하기 - spring security (로그인, 로그아웃, 회원가입) (0) | 2021.12.04 |