[Spring Data] Spring Data JPA?

Seonghun Kim·2022년 8월 14일
0

Spring!

목록 보기
3/8
post-thumbnail

📌JPA (Java Persistence API)

Java ORM 기술의 표준 명세로, 자바에서 제공하는 API

  • ORM (Object Relational Mapping) : 객체형 관계형 데이터베이스 메핑
    • 자바는 객체 지향 패러다임, 관계형 데이터베이스는 데이터를 정규화해서 잘 보관하는 것이 목표
    • 객체지향과 관계형 데이터베이스 간의 패러다임의 불일치를 해결하기 위한 기술

✔ JPA의 장점

  • 특정 데이터베이스에 종속되지 않음
    • 추상화한 데이터 접근 계층을 제공하기 때문에 데이터베이스 종류 변경 가능
  • 데이터베이스 설계 중심이 아닌 객체지향적으로 설계 가능
  • 필드 관리가 편리하고, SQL문 작성없이 객체를 사용하여 쉽게 유지보수 가능

✔ JPA의 단점

  • 복잡한 쿼리에 대해서는 SQL보다 표현하기 어려울 수 있음
  • 객체 간 매핑 설계를 잘못하거나 자동으로 생성되는 쿼리들에 의해 성능이 저하될 수 있음

📌 JPA 동작 방식

✔ Entity

  • 데이터베이스의 테이블에 대응하는 클래스
  • @Entity를 클래스에 붙여서 표현

✔ Entity manager

  • entity manager factory로부터 생성
  • 영속성 컨텍스트에 접근하여 entity에 대한 데이터베이스 작업을 제공

✔ 영속성 컨텍스트 ⭐

  • entity를 영구 저장하는 환경으로, entity manager를 통해 접근
  • entity 생명주기

비영속 (new)

// 영속성 컨텍스트에 저장할 entity 생성
Item item = new Item();
  • entity가 new 키워드를 통해 생성되어 영속성 컨텍스트와 관련이 없는 상태

영속 (managed)

// entity manager 생성
EntiryManager em = entityManagerFactory.createEntityManager();

// entity manager의 데이터 무결성을 위해 트랜잭션 생성 및 시작
EntityTransaction transaction = em.getTransaction();
transaction.begin();

// entity를 영속성 컨텍스트에 저장
em.persiste(item);

// 트랜잭션을 데이터베이스에 반영
transaction.commit();
  • entity가 영속성 컨텍스트에 저장되어 관리되는 상태
  • commit 시점에 데이터베이스에 저장

준영속 (detached)

// 사용한 자원을 반환
em.close();
  • entity가 컨텍스트에 저장되었다가 분리된 상태
  • em.detach(item) 또는 em.clear()로 준영속 상태로 변환 가능

삭제 (removed)

em.remove();
  • entity가 영속성 컨텍스트와 데이터베이스에서 삭제된 상태

✔ 영속성 컨텍스트의 특징

  • 애플리케이션과 데이터베이스 사이에 영속성 컨텍스트라는 중간 계층이 존재
  • 이 중간 계층에 의해 버퍼링, 캐싱 등을 할 수 있는 장점을 가짐

1차 캐시

  • 영속성 컨텍스트에 (key, value) 형태로 저장
  • entityManager.find() 메소드 호출 시 1차 캐시를 조회
  • entity가 있으면 반환, 없으면 데이터베이스에서 조회하여 1차 캐시에 저장 후 반환

동일성 보장

  • 동일한 트랜잭션에서 동일한 키값으로 영속성 컨텍스트에 저장된 entity 조회 시 같은 entity 조회 보장
  • 1차 캐시에 저장된 entity를 조회하기 때문

쓰기 지연

  • 영속성 컨텍스트에 entity를 저장하면 1차 캐시에 저장되는 동시에 쓰기 지연 저장소에 SQL문 저장
  • flush : SQL문을 쌓아두었다가 트랜잭션 commit 시점에 SQL문들이 데이터베이스에 반영

변경 감지

  • 1차 캐시에 저장된 entity와 비교하여 변경 내용이 있는 경우, UPDATE SQL문을 쓰기 지연 저장소에 저장
  • 변경을 감지하기 때문에 따로 UPDATE문을 쓸 필요가 없음

0개의 댓글