JPA
JPA 영속성 컨텍스트란? 쉽게 이해하는 JPA 핵심 개념
초코너무조코
2025. 4. 24. 18:16
728x90
1. 영속성 컨텍스트란 무엇인가?
JPA(Java Persistence API)를 사용하다 보면 "영속성 컨텍스트(Persistence Context)"라는 용어를 자주 접하게 됩니다. 영속성 컨텍스트는 엔티티를 관리하는 일종의 메모리 공간으로 이해할 수 있습니다. 더 정확히 말하면, 엔티티 객체를 데이터베이스와 동기화된 상태로 유지해주는 캐시입니다.
JPA를 처음 접할 때 혼란스러울 수 있는 이 개념, 지금부터 쉽게 풀어보겠습니다.
2. 영속성 컨텍스트의 역할
- 엔티티 관리: 데이터베이스에서 조회한 엔티티 객체를 관리합니다.
- 1차 캐시: 같은 트랜잭션 내에서 동일한 엔티티를 여러 번 조회해도 데이터베이스에 다시 접근하지 않고 메모리에서 가져옵니다.
- 변경 감지 (Dirty Checking): 영속성 컨텍스트에 저장된 엔티티의 값이 바뀌면, 트랜잭션 커밋 시 변경된 내용을 자동으로 DB에 반영합니다.
- 지연 로딩 (Lazy Loading): 필요한 시점에 데이터를 가져오게 해 리소스를 절약합니다.
3. 영속성 컨텍스트의 생명 주기
- 비영속 (Transient): 엔티티 객체가 생성됐지만 아직 영속성 컨텍스트에 저장되지 않은 상태.
- 영속 (Persistent): em.persist()를 통해 영속성 컨텍스트에 저장된 상태. 이때부터 JPA가 엔티티를 관리합니다.
- 준영속 (Detached): 영속성 컨텍스트에서 분리된 상태. 더 이상 변경 감지가 되지 않습니다.
- 삭제 (Removed): 삭제 대상이 된 상태. 트랜잭션 커밋 시 데이터베이스에서도 삭제됩니다.
4. 영속성 컨텍스트의 장점
- 성능 최적화: 1차 캐시 덕분에 같은 SQL을 반복 실행하지 않아 효율적입니다.
- 자동 변경 감지: em.persist() 이후 직접 SQL을 작성하지 않아도, 변경된 데이터는 자동 반영됩니다.
- 트랜잭션 단위 작업: 트랜잭션 단위로 데이터를 관리하고 반영하므로, 일관성을 보장할 수 있습니다.
5. 코드로 보는 영속성 컨텍스트 예시
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId(1L);
member.setName("John");
// 비영속 상태
em.persist(member); // 영속 상태로 변경
member.setName("Johnny"); // 변경 감지
tx.commit(); // 변경 사항 DB에 반영
em.close();
위 코드에서 em.persist()를 통해 member는 영속 상태가 됩니다. 이후 이름을 변경하면 커밋 시 자동으로 업데이트 쿼리가 실행됩니다.
6. 정리
- 영속성 컨텍스트는 JPA가 제공하는 강력한 데이터 관리 도구입니다.
- 효율적인 캐싱, 자동 변경 감지, 트랜잭션 기반 작업 관리로 개발자는 SQL을 일일이 신경 쓰지 않아도 됩니다.
- JPA의 성능과 일관성을 제대로 활용하려면 영속성 컨텍스트의 개념을 확실히 이해하는 것이 중요합니다.
728x90