JPA를 사용하면서 반드시 알아야 하는 개념 중 하나가 영속성(Persistence) 이다.
영속성 컨텍스트는 JPA가 제공하는 핵심 개념이며, 엔티티의 생명주기와 깊이 연관된다.
이 글에서는 JPA의 영속성 개념과 엔티티의 생명주기에 대해 정리해본다.
1. 영속성이란?
📌영속성(Persistence) = 지속되는 것
프로그램에서 데이터를 메모리(RAM)에 저장하면, 프로그램이 종료되면 데이터가 사라진다.
하지만, 중요한 데이터는 프로그램이 종료되더라도 유지되어야 한다.
이러한 데이터 지속성(Persistence)을 보장하기 위해 DB나 파일에 저장하는 것이 필요하다.
즉, DB에 저장된 데이터는 프로그램이 종료되어도 유지되므로 "영속적"이라고 할 수 있다.
JPA에서의 영속성
JPA에서는 영속성 컨텍스트(Persistence Context) 라는 개념을 사용하여 엔티티를 관리한다.
- 영속성 컨텍스트는 Entity(객체)를 저장하고 관리하는 공간 (엔티티를 영구 저장하는 환경)
- RAM에서 관리되므로 속도가 빠름
- 단순히 데이터를 DB에 저장하는 게 아니라, 한번 가져온 데이터를 영속성 컨텍스트에 보관해서
같은 데이터를 여러번 조회해도 DB에 다시 접근하지 않도록 최적화하고,
데이터 변경 시 자동으로 DB에 반영될 수 있도록 관리 - EntityManager를 통해 영속성 컨텍스트에 접근하고 관리
- 하나의 영속성 컨텍스트는 여러개의 EntityManager에서 공유될 수 있다.
영속성 컨텍스트 덕분에 JPA는 트랜잭션이 끝날 때까지 변경된 내용을 모아뒀다가 한 번에 반영하는 기능(쓰기 지연, Dirty Checking 등)을 제공할 수 있다.
2. Hibernate(하이버네이트)란?
Hibernate는 JPA의 구현체 중 하나로, JPA가 정의한 표준을 실제로 동작하도록 만든 ORM 프레임워크이다.
JPA | Hibernate |
자바에서 ORM을 쉽게 하기 위한 표준 인터페이스 (명세) | JPA의 구현체. 실제 동작하는 ORM 프레임워크 |
ORM의 표준을 정의 | JPA의 기능을 실제로 구현 |
즉, JPA는 ORM을 쉽게 사용할 수 있도록 표준을 제공하는 것이고, Hibernate는 JPA의 표준을 구현한 라이브러리라고 보면 된다.
3. ORM(Object-Relational Mapping) 사용 이유
객체지향 프로그래밍(OOP)에서 중요한 개념들은 다음과 같다.
✅ 추상화
✅ 캡슐화
✅ 정보 은닉
✅ 상속
✅ 다형성
하지만 SQL 중심으로 개발하면 객체 지향적인 설계가 어려워지는 문제가 발생한다.
- 관계형 데이터베이스(RDB)에서는 객체를 저장할 때 객체의 참조(Reference)를 저장할 수 없음
- 객체의 고유 값(예: ID)으로 관계를 맺어야 하는데, 이 과정이 복잡해짐
➡️ ORM 사용!
ORM을 사용하면 객체 지향적으로 설계하면서도 데이터베이스와 쉽게 매핑 가능
즉, SQL에 의존하지 않고 객체 중심으로 데이터를 다룰 수 있다.
4. 엔티티의 생명주기 (Entity Lifecycle)
엔티티도 생성 → 사용 → 종료라는 생명주기가 있다.
JPA에서는 엔티티가 영속성 컨텍스트와 어떤 관계를 맺고 있느냐에 따라 4가지 상태로 구분할 수 있다.
📌 엔티티의 생명주기
비영속 (Transient)
영속 (Persistent)
준영속 (Detached)
삭제 (Removed)
1️⃣비영속(Transient) - 영속성 컨텍스트와 관계 없음
Member member = new Member(); // 엔티티(객체) 생성
- 단순히 new 키워드를 사용하여 객체를 생성한 상태
- 아직 영속성 컨텍스트와 관계가 없음
2️⃣영속(Persistent) - 영속성 컨텍스트에서 관리됨
em.persist(member); // 엔티티를 영속성 컨텍스트에 저장
- persist()를 호출하면 영속성 컨텍스트가 엔티티를 관리하기 시작함
- 아직 DB에 저장되지 않음 → 트랜잭션이 커밋될 때 flush()가 실행되면서 DB에 반영됨
- 쓰기 지연 (Write Behind) 기능 덕분에 여러 개의 변경 사항을 모아서 한 번에 DB에 반영 가능
3️⃣준영속(Detached) - 영속성 컨텍스트에서 분리됨
em.detach(member); // 특정 엔티티만 영속성 컨텍스트에서 분리
em.clear(); // 모든 엔티티를 영속성 컨텍스트에서 분리
- 영속 상태였던 엔티티가 영속성 컨텍스트에서 분리되는 상태
- 더 이상 JPA가 관리하지 않으며, 변경 감지도 수행되지 않음
- detached 상태의 엔티티는 DB와 동기화되지 않음
4️⃣삭제(Removed) - DB에서도 삭제됨
em.remove(member); // 엔티티 삭제
- 영속성 컨텍스트에서 제거되며, DB에서도 삭제됨
- flush()가 실행되면 DELETE 쿼리가 실행됨
'Java Study > Frameworks' 카테고리의 다른 글
[Spring] @Transactional을 어디에 붙여야 할까🤔❔ (0) | 2025.02.12 |
---|---|
[Spring] spring.jpa.hibernate.ddl-auto 설정과 각 옵션 (0) | 2025.02.12 |
[Spring] JPA 영속성 컨텍스트와 JOIN 활용 (0) | 2025.02.12 |
[Spring] Spring Data JPA에서 @Repository를 사용하지 않는 이유 (1) | 2025.02.09 |
[Spring] JPA Auditing 적용하기: @CreatedDate, @LastModifiedDate 활용법 (0) | 2025.02.07 |