데이터베이스 영속화(Persistence)는 애플리케이션의 객체 상태를 데이터베이스에 영구적으로 저장하는 과정을 의미합니다. 영속화는 자바 애플리케이션에서 데이터베이스와의 상호작용을 통해 객체를 영속 저장소(데이터베이스)에 보존하는 중요한 개념입니다. 이를 통해 객체는 애플리케이션이 종료되더라도 데이터베이스에 영구히 저장되어 필요할 때 다시 사용할 수 있게 됩니다.
1. 영속성(Persistence)이란?
- 영속성은 데이터를 메모리에서 휘발성 저장소(예: 메모리)에서 영구 저장소(예: 데이터베이스)로 옮기는 과정입니다. 즉, 자바 애플리케이션의 객체 데이터를 데이터베이스에 저장하고, 나중에 이를 다시 불러오는 것을 말합니다.
- 자바에서 영속성 관리는 주로 JPA(Java Persistence API) 또는 Hibernate와 같은 ORM 프레임워크를 사용하여 처리합니다.
2. 영속성 컨텍스트(Persistence Context)
- 영속성 컨텍스트는 JPA에서 엔티티 객체를 관리하는 메모리 공간을 의미합니다. 엔티티가 영속성 컨텍스트에 존재하는 동안, JPA는 해당 엔티티의 변경 사항을 추적하고 필요할 때 데이터베이스에 반영합니다.
- JPA의
EntityManager
는 영속성 컨텍스트를 통해 엔티티의 상태를 관리합니다.
3. 영속성 상태
JPA에서 엔티티의 상태는 크게 4가지로 나뉩니다:
- 비영속(Transient):
- 엔티티 객체가 새로 생성되었지만, 아직 영속성 컨텍스트나 데이터베이스와 관계가 없는 상태입니다. 즉, 메모리에만 존재하는 객체입니다.
- 이 상태에서는 데이터베이스에 저장되지 않으며,
persist()
와 같은 메서드를 호출해야 영속화됩니다.
- 영속(Managed):
- 엔티티 객체가 영속성 컨텍스트에 저장된 상태입니다. 이 상태에서는
EntityManager
가 엔티티의 변경 사항을 추적하며, 트랜잭션이 커밋될 때 변경 사항이 자동으로 데이터베이스에 반영됩니다.
- 엔티티 객체가 영속성 컨텍스트에 저장된 상태입니다. 이 상태에서는
- 준영속(Detached):
- 영속성 컨텍스트에서 더 이상 관리되지 않는 엔티티 상태를 말합니다. 예를 들어,
EntityManager
를 닫으면 그 엔티티는 더 이상 영속성 컨텍스트에 의해 관리되지 않습니다. - 엔티티가 데이터베이스에 남아있지만, 더 이상 변경 사항이 추적되지 않습니다.
- 영속성 컨텍스트에서 더 이상 관리되지 않는 엔티티 상태를 말합니다. 예를 들어,
- 삭제(Removed):
- 엔티티가 영속성 컨텍스트에서 삭제된 상태입니다. 데이터베이스에서 제거되며, 트랜잭션이 커밋될 때 데이터베이스에서 실제로 삭제됩니다.
4. JPA를 통한 영속화 예시
엔티티 클래스
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String username;
private Integer age;
// Getter, Setter
}
JPA를 사용한 영속화 과정
public class JpaExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); // 트랜잭션 시작
// 비영속 상태: 메모리에만 존재하는 객체
Member member = new Member();
member.setId(1L);
member.setUsername("John");
member.setAge(30);
// 영속 상태로 전환: 객체를 영속성 컨텍스트에 저장
em.persist(member);
// 영속성 컨텍스트를 통해 관리된 엔티티는 자동으로 데이터베이스에 반영됨
tx.commit(); // 트랜잭션 커밋: 영속성 컨텍스트의 변경 사항을 DB에 반영
} catch (Exception e) {
tx.rollback(); // 예외 발생 시 롤백
} finally {
em.close(); // 엔티티 매니저 종료: 영속성 컨텍스트 종료
emf.close();
}
}
}
위 코드에서:
em.persist(member)
를 통해 객체가 영속 상태로 전환됩니다.- 트랜잭션이 커밋될 때(
tx.commit()
), 영속성 컨텍스트에 있는 엔티티의 변경 사항이 데이터베이스에 반영됩니다.
5. 영속화의 장점
- 변경 관리: 영속성 컨텍스트에 저장된 엔티티는 자동으로 변경 사항이 추적되며, 데이터베이스와 일관성을 유지할 수 있습니다.
- 지연 로딩: 엔티티를 영속화하면서 필요한 시점에만 연관된 데이터를 로드할 수 있어 성능을 최적화할 수 있습니다.
- 트랜잭션 관리: 영속성 컨텍스트를 통해 트랜잭션 단위로 데이터베이스 작업을 처리할 수 있습니다.
6. JPA의 영속성 관련 메서드
persist()
: 객체를 영속성 컨텍스트에 저장합니다.remove()
: 영속성 컨텍스트에서 객체를 삭제하고, 데이터베이스에서 삭제할 준비를 합니다.find()
: 데이터베이스에서 엔티티를 조회하고, 조회한 엔티티를 영속성 컨텍스트에 저장합니다.merge()
: 준영속 상태의 엔티티를 다시 영속 상태로 만들어 데이터베이스와 동기화합니다.
7. 영속성 컨텍스트와 1차 캐시
- JPA는 엔티티를 영속성 컨텍스트에 저장하면 1차 캐시에 저장합니다. 이 덕분에 데이터베이스에 중복으로 쿼리를 보내지 않고, 메모리에서 캐시된 데이터를 사용할 수 있습니다.
- 예를 들어, 동일한
ID
로 두 번find()
를 호출해도 실제 데이터베이스에 두 번 조회하지 않고, 1차 캐시에서 데이터를 반환합니다.
결론
영속화는 자바 애플리케이션의 객체를 데이터베이스에 영구적으로 저장하는 과정이며, JPA는 이를 추상화하여 객체 중심으로 데이터베이스와 상호작용할 수 있게 도와줍니다. 영속성 컨텍스트를 통해 데이터의 변경을 관리하고, 효율적으로 데이터베이스와 연동할 수 있습니다.
'JPA' 카테고리의 다른 글
이너 조인(Inner Join)과 레프트 조인(Left Join) (0) | 2024.09.20 |
---|---|
JPA 자동생성전략 3가지방법 ( IDENTITY, SEQUENCE, TABLE ) (2) | 2024.09.11 |
JPA가 제공하는 주요 CRUD 기능 (0) | 2024.09.10 |
JDBC와 JPA의 관계 (0) | 2024.09.09 |
JPA(Java Persistence API) (1) | 2024.08.08 |