Helmi

JPA란? 본문

SpringBoot

JPA란?

Helmi 2023. 3. 7. 12:52

 

#JPA (Java Persistence API)

  자바 ORM 기술에 대한 API 표준.

#ORM

  Object Relational Mapping의 약자, 객체와 관계형 데이터베이스를 매핑해주는 것

 

1. JAP란?

  보통 데이터를 관계형 데이터 베이스에서 관리하기 위해 SQL문 사용.

개발자가 CRUD(Insert, Update, Select, Delete)문 작성해 객체를 관계형 데이터 베이스에 넣어주고 가져오는 작업 하는 것.

  SQL 중심 개발의 문제점 : 자바 객체를 SQL 통해 데이터 베이스에 관리하게 하고 데이터 베이스에서 저장된 데이터를 자바 애플리케이션에서 사용하려면 SQL 통해 다시 자바 객체로 변환하는 반복적 작업 해야 함. (SQL 매핑 역할 반복)

 

또한 객체와 관계형 데이터 베이스의 패러다임 불일치(가장 큰 문제). 객체 지향적으로 프로그래밍 불가.

→ ORM 나옴

ORM 이용한 자바 객체와 관계형 데이터 베이스 매핑

ORM이 중간에서 2개를 매핑해 줌으로 개발자는 소스를 조금 더 객체 지향적으로 설계하고 비즈니스 로직에 집중 가능.

 

JPA는 위에서 설명한 ORM 기술의 표준 명세. 자바에서 제공하는 API.

인터페이스고 이를 구현한 대표적인 구현체로 Hibernate, EclipseLink, DataNucleus, OpenJpa, TopLink 등이 있음.

JPA 인터페이스 구현한 가장 대표적 오픈 소스 : Hibernate(하이버네이트)

 

#JPA 사용 장점

1. 특정 데이터베이스에 종속 X

  - 추상화한 데이터 접근 계층 제공. 설정 파일에 어떤 데이터베이스 사용하는지 알려주면 얼마든지 변경 가능

2. 객체 지향적 프로그래밍

  - 더 직관적이고 비즈니스 로직에 집중할 수 있도록 도와줌

3. 생산성 ↑

  - 테이블과 매핑된 크래스에 필드 추가하면 쉽게 관리 가능. 유지 보수와 재사용성↑

 

#JPA 사용 단점

1. 복잡한 쿼리 처리

  - 통계 처리와 같은 복잡한 쿼리 사용할 경우 SQL문 사용이 더 나을 수 있음. 기존 SQL문 사용 가능하나 특정 데이터 베이스에 종속 된다는 단점 생김. 이를 보완하기 위해 JPQL 지원

2. 성능 저하 위험

  - 객체간 매핑 설계 잘못 했을 때. 자동으로 생성되는 커리 많아서 의도하지 않은 쿼리로 인한 성능 저하가 있기도 함

3. 학습 시간

  - 알아야 할 것이 많음. 관계형 데이터베이스 충분히 알아야 사용 가능.

 

2. JPA 동작 방식

엔티티 (Entity)

데이터베이스의 테이블에 대응하는 클래스

 

엔티티 매니저 팩토리 (Entity Manager Factory)

엔티티 메니저 인스턴스 관리 주체. 애플리 케이션 실행시 한 개만 만들어지며 사용자로부터 요청 오면 엔티티 매니저 생성

 

엔티티 매니저 (Entity Manager)

영속성 컨텍스트에 접근해 엔티티 대한 데이터베이스 작업 제공. 내부적으로 데이터베이스 커넥션 사용해 데이터 베이스에 접근.

 

# 엔티티 매니저 메소드

1. find() : 영속성 컨텍스트에서 엔티티 검색, 없을 경우 데이터 베이스에서 데이터 찾아 영속성 컨텍스트에 저장

2. persist() : 엔티티를 영속성 컨텍스트에 저장

3. remove() : 엔티티 클래스를 영속성 컨텍스트에서 삭제

4. flush() : 영속성 컨텍스트에 저장된 내용 데이터 베이스에 반영

 

영속성 컨텍스트

엔티티를 영구 저장하는 환경으로 엔티티 메니저를 통해 영속성 컨텍스트에 접근

엔티티 생명주기

생명주기 내용
비영속 (new) new 키워드 통해 생성된 상태. 영속성 컨텍스트와 관련 없는 상태
영속 (managed) - 엔티티가 영속성 컨텍스트에 저장된 상태. 영속성 컨텍스트 의해 관리디는 상태
- 영속 상태에서 데이터베이스에 저장 X 트렌젝션 커밋 시점에 데이터베이스에 반영
준영속 상태 (detached) 영속성 컨텍스트에 엔티티 저장되었다가 분리된 상태
삭제 상태 (removed) 영속성 컨텍스트와 데이터베이스에서 삭제된 상태

 

영속성 컨텍스트 사용 시 이점

1) 중간계층이 있으면 버퍼링, 캐싱 등 할 수 있다.

1차 캐시 : entityManager.find()메소드 호출 시 1차 캐시 조회.

엔티티 존재 - 해당 엔티티 반환

엔티티 존재 X  - 데이터 베이스에서 조회 후 1차 캐시에 저장 및 반환 

2) 통일성 보장

하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회 보장

(1차 캐시에 저장된 엔티티 조회하기 때문) 

3) 트랜젝션 지원하는 쓰기 지연

영속성 컨텍스트에는 쓰기 지연 SQL 저장소 존재. entityManager.persist() 호출하면 1차 캐시에 저장되는 것 동시에 쓰기 지연 SQL 저장소에 SQL 문이 저장 됨. 이렇게 SQL 쌓아두고 트랜잭션 커밋하는 시점에 저장된 SQL문들이 flush 되면서 데이터베이스에 반영.

4) 변경 감지

JPA는 1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷 가지고 있음.

1차 캐시에 저장된 엔티티와 스냅샷 비교 후 변경 내용 있다면 UPDATE SQL문 쓰기 지연 SQL 저장소에 담아 둠

이후 데이터 베이스 커밋 시점에 변경 내용 자동 반영 → 따로 update문 호출 필요 없음

'SpringBoot' 카테고리의 다른 글

상품 엔티티 설계  (0) 2023.03.13
쇼핑몰 프로젝트 생성  (0) 2023.03.12
@Lombok 어노테이션 정리  (0) 2023.03.06
스프링 부트 프로젝트 만들기  (0) 2023.03.06
스프링 부트의 특징  (0) 2023.03.06