[JPA] 영속성 관리

hwarye·2022년 12월 30일
0

JPA

목록 보기
3/5

목차

  • ORM / JPA / Hibernate / SpringData JPA / JPA Repository
  • 엔티티 매니저 팩토리 - 엔티티 매니저
  • 영속성 컨텍스트
  • 엔티티의 생명 주기
  • 영속성 컨텍스트 특징 CRUD
  • 플러시
  • 준영속

ORM / JPA / Hibernate / SpringData JPA / JPA Repository

🫧 ORM

Object - Relational Mapping
객체와 관계형 데이터베이스 매핑.

Mapping : 중간에서 무언가를 해주는 것.
즉, ORM 프레임워크가 중간에서 다른 부분들을 매핑해서 해결해준다!

-> 대중적인 언어에는 대부분 ORM 존재.
-> ORM 프레임워크는 객체와 테이블을 매핑하여 패러다임 불일치 문제를 개발자 대신 해결.
-> 즉, 객체를 데이터베이스에 저장할 때, INSERT SQL을 직접 작성하는 것이 아닌, 객체를 자바 컬렉션이 저장하듯 ORM 프레임워크에 저장하면, ORM 프레임워크가 적절한 INSERT SQL을 생성하여 데이터베이스에 객체를 저장해준다.

🫧 JPA

Java Persistence API
자바 진영의 ORM 기술 표준.
자바 ORM 기술에 대한 API 표준 명세.

자바 애플리케이션과 JDBC 사이에서 동작.
자바에서 DB와 통신하려면 JDBC API 써야 함 -> 이전에는 개발자가 직접 JDBC API를 썼다면, JPA가 대신 해주는 것.

jpa.persist(member); //Jpa 사용해 객체 저장

DAO에서 persist로 Entity Object를 넘기면,
JPA에서 Entity 분석, INSERT SQL 생성, JDBC API 사용, 패러다임 불일치 해결해줌.

Member member = jpa.find(memberId); //jpa 사용해 객체 조회

JPA에서 SELECT SQL 생성, JDBC API 사용, ResultSet 매핑, 패러다임 불일치 해결해줌.

🫧 Hibernate

오픈 소스.

🫧 SpringData JPA

🫧 JPA Repository


엔티티 매니저 팩토리 - 엔티티 매니저

🫧 엔티티 매니저 팩토리

  • 엔티티 매니저 만드는 공장.
  • 공장 만드는 데 비용 상당함. -> 한 개만 만들어서 애플리케이션 전체에서 공유.
  • 여러 개의 스레드가 동시에 접근해도 안전 -> 다른 스레드 간 공유 가능.

🫧 엔티티 매니저

  • 엔티티 저장, 수정, 삭제, 조회 등등 엔티티와 관련된 모든 일 처리.

  • 즉, 엔티티를 관리하는 관리자.

  • like '엔티티를 저장하는 가상의 데이터베이스'

  • 공장에서 엔티티 매니저를 생성하는 비용은 거의 들지 않는다.

  • 여러 스레드가 동시 접근할 경우 동시성 문제 발생 -> 스레드 간 공유 절대 금지.

//엔티티 매니저 팩토리 생성

EntityManagerFactory emf = 
Persistence.createEntityManagerFactory("jpabook");

//공장에서 엔티티 매니저 생성 -> 비용 거의 안든다.
EntityManager em = emf.createEntityManager();

영속성 컨텍스트

(애플리케이션과 데이터베이스 사이에 존재하는 무언가)
-> 논리적인 개념 & 눈에 보이지 않음.
: JPA를 이해하는데 가장 중요한 언어!!!!!

=> ⭐️ "엔티티를 영구 저장하는 환경"
EntityManager.persist(entity); -> DB에 저장 X, 영속성 컨텍스트에 저장 O.

J2SE 환경
EntityManager를 생성하면 1:1로 그 안에 PersistenceContext(영속성 컨텍스트)가 생성됨.
( 엔티티 매니저 내부에 눈에 보이지 않는 영속성 컨텍스트 공간이 생기는 것임. )

=> 엔티티 매니저를 통해 영속성 컨텍스트에 접근

이점

  • 1차 캐시
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
  • 변경 감지 (Dirty Checking)
  • 지연 로딩 (Lazy Loading)

생명주기

1) 비영속성(new/transient)

영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

    //✅ 객체를 생성한 상태 (비영속)
    Member member = new Member();
    member.setId("memberId");
    member.setUsername("회원1");
    //jpa 관계 없이 객체만 생성한 상태. 

-> 객체 생성만 하고, 엔티티 매니저에 아무것도 안넣고 생성만 한 상태, 셋팅만 한 상태.

2) 영속(managed)

영속성 컨텍스트에 관리되는 상태
EntityManager.persist(entity); -> 영속 상태(managed 상태)가 되는 것.

    //객체를 생성한 상태 (비영속)
    Member member = new Member();
    member.setId("memberId");
    member.setUsername("회원1"); //jpa 관계 없이 객체만 생성한 상태. 
    
    EntityManeger em = emf.createEntityManager();
    em.getTransaction().begin();
    
    //✅ 객체를 저장한 상태 (영속)
    em.persist(member);

➕ 영속 상태는 되지만, 실질적으로 DB에 저장되는 것은 아님.
-> DB는 이후 커밋해야 저장됨
-> 즉, 트랜잭션을 커밋하는 시점에 DB에 쿼리 날라감. commit();

3) 준영속(detached)

영속성 컨텍스트에 저장되었다가 분리된 상태
em.detach();

    //객체를 생성한 상태 (비영속)
    Member member = new Member();
    member.setId("memberId");
    member.setUsername("회원1"); //jpa 관계 없이 객체만 생성한 상태. 
    
    EntityManeger em = emf.createEntityManager();
    em.getTransaction().begin();
    
    //객체를 저장한 상태 (영속)
    em.persist(member);
    
    // ✅ 준영속
    em.detach(member); //-> 영속성 컨텍스트에서 다시 지움.

회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태로! -> 영속성 컨텍스트와 아무 관련이 없어짐.

4) 삭제 (removed)

삭제된 상태
em.remove();

    // ✅ 삭제
    em.remove(member); //-> DB 삭제 요청

실제 DB 삭제 요청.
" 실제 영구 저장한, 데이터베이스에서 지우겠다. "


profile
례코드

0개의 댓글