-- 목차 --
JPA 란
- Hibernate
- 영속성 컨텍스트
ORM 이란
JPA의 동작 과정
JPA를 사용해야 하는 이유(장,단점)
JPA란
Java persistence API
현재 자바 진영의 ORM 기술 표준 스펙을 정의한다.
JPA의 스펙은 자바의 객체와 데이터베이스를 어떻게 매핑하고 동작해야 하는지를 정의하고 있다.
- 인터페이스의 모음이다.
- 즉, 실제로 구현되는 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.
- 대표적인 Framework : Hibernate
과거 자바 표준(Entity Bean)으로, EJB라는 것이 있다.
JPA 이전의 ORM기술이다.
단점
- 코드가 매우 지저분 하다.
- API의 복잡성이 높다. (interface를 많이 구현해야 함)
- 속도가 느리다.
하이버네이트(Hibernate)
ORM Framework 중 하나. 'JPA 프로바이더' 라고도 부름
JPA의 실제 구현체 중 하나이며, 현재 JPA 구현체 중 가장 많이 사용됨.
( 다른 Framework는 EclipseLink, DataNucleus 등이 있음)
영속성 컨텍스트(Persistence Context)
- 영속성 컨텍스트(Persistence Context)는 JPA가 관리하는 Entity 객체의 집합
- Entity 객체가 영속 컨텍스트에 들어오게 되면 JPA는 엔티티 객체의 매핑 정보를 가지고 DB에 반영함
- Entity 객체가 영속 컨텍스트에 들어오게 되어 관리 대상이 되면, 그 객체를 영속 객체라고 부름. (= 영속화 되었다)
- 영속성 컨텍스트에 접근하기 위해서 ! Entity Manager를 사용함!
- 서비스 별로 하나의 EntityManager Factory가 존재하며, Entity Manager Factory에서 DB에 접근하는 Transaction이 생길 때 마다 Thread별로 Entity Manager를 생성하여 영속성 컨텍스트에 접근한다.
- Entity는 Detach, Merge, Remove, Persist 라는 4가지 상태를 가진다.
- 세션 단위로 생명주기를 갖고 있음 ( 세션이 생기면서 만들어 지고, 세션이 종료되면 없어짐 )
- Entity Manager는 하나의 세션으로 보고 아래와 같은 방식으로 동작을 구성함(Factory구조)
1. Entity Manager Factory를 통해 Entity Manager 생성
2. Entity Manager가 가지고 있는 트랜잭션(Transaction) 을 시작
3. Entity Manager를 통해 영속컨텍스트에 접근하고 객체를 작업 (CRUD)
4. Transaction을 commit 하여 DB에 반영
5. Entity Manager 종료
(자세한건 Hibernate JPA EntityManager 핵심 기능 정리 )
영속성 컨텍스트 1차 캐시
Entity Class
JPA annotation을 통해 정의
@Entity : 해당 클래스가 JPA Entity Class라고 정의
@Table : 해당 클래스가 데이터베이스의 어느 테이블에 매핑되는지 정의
@Id : DB테이블의 Primary Key 칼럼과 매핑
@Column : 매핑할 데이터베이스의 칼럼 이름과 필드 변수의 이름이 다를 경우 매핑하기 위해 사용
프록시구조로 객체들을 JPA가 관리 => Default Constructor 필요(@NoArgConstructor)
ORM이란
Object-relational mapping
- 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
- Entity 객체와 관계형 데이터베이스(RDB) 사이에서 Mapping 해준다.
- 객체와 RDB 위에 있는 기술이다.
JPA의 동작 과정
JPA는 Application 과 JDBC사이에서 동작한다.
- JPA 내부에서 JDBC API를 사용하여 query를 호출하고 driver를 거쳐 DB와 통신한다.
저장 과정
조회 과정
- 1차 캐시에 조회하는 객체가 존재하는 경우
- 1차 캐시에 조회하는 객체가 존재하지 않는 경우
삭제 과정
수정 과정
실패 : Entity 객체를 수정해도 DB에는 update가 되지 않는다.
- 1차 캐시 Entity 객체에만 업데이트 반영됨.
- Usesr DB 에는 반영되지 않음
- 객체와 DB 값 불일치
업데이트 방법
1. userRepository.save() 사용
2. @Transactional 추가
- 함수가 끝나는 시점에 변경된 부분을 알아서 업데이트 해줌 (Dirty Checking)
- 함수가 종료되는 시점에 save()를 해준다
추가 학습 내용 : 쓰기 지연 SQL 저장소, flush, commit ..
- Query를 JPA가 만들어 주기 때문에 Object 와 DB간의 패러다임 불일치를 해결 할 수 있다.
- JAVA 객체를 DB에 저장할 수 있다.
- DB 결과값(ResultSet)을 JAVA 객체에 매핑할 수 있다.
1차 캐시 사용의 장점
1. DB 조회 횟수를 줄임
2. '1차 캐시' 를 사용해 DB row 1개당 객체 1개가 사용되는 것을 보장(객체 동일성 보장)
JPA를 사용해야 하는 이유(장점)
- SQL 문이 아닌 Method를 통해 DB를 조작 할 수 있어 비즈니스 로직을 구성하는데 집중할 수 있다.
- SQL 중심적인 개발이 아닌 객체 중심 개발로 생산성을 높일 수 있다.
- 매핑 정보가 Class로 명시되어 있기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링이 편하다.
- Object 와 RDB간의 패러다임 불일치를 해결해준다.
- JPA 의 성능 최적화 기능이 있다.
- 데이터 접근 추상화와 벤더 독립성
- 표준..이닷
단점
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다.
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있다. (Native sql 기능 사용)
Reference
[JPA] OSIV(Open-Session-In-View)
'공부 > SpringBoot' 카테고리의 다른 글
[SpringBoot] JPA 연관관계 (0) | 2022.08.02 |
---|---|
[Error] pom.xml parent 에러 (0) | 2022.04.18 |
[블로그] 회원가입 문제와 게시글 삭제 문제 (0) | 2022.03.08 |
[블로그] 댓글 (0) | 2022.03.08 |
[블로그] 회원수정 및 카카오로그인 (0) | 2022.03.06 |
댓글