-
1. 영속 컨텍스트와 엔티티IT 서적/JPA 퀵 스타트 2023. 10. 21. 12:49
영속 컨텍스트란?
- JPA의 영속 컨텍스트가 애플리케이션과 실제 데이터베이스를 연결해주는 기능을 제공 컨테이너이다.
영속 컨테이너와 엔티티 상태
- 영속 컨테이너는 엔티티들을 4가지 '상태'로 관리한다.
상태 의미 생성(NEW) 엔티티가 영속 컨테이너에 등록되지 않은 상태 관리(MANAGED) 엔티티가 영속 컨테이너에 등록된 상태 분리(DETACHED) 엔티티가 등록됐다가 컨테이너에 분리된 상태 삭제(REMOVED) 엔티티가 영속 컨테이너에서 삭제 처리된 상태 1. 생성상태
Employee employee = new Employee() ; employee.setName("둘리") ;
- 엔티티의 생성 상태를 코드로 표현하면 위와 같다. 이는 엔티티 객체를 생성만 했을 뿐 아직 영속 컨테이너에 등록되지 않은 상태이다.
2. 관리상태
- 관리상태는 영속상태라고도 하며, 단순하게 엔티티가 영속 컨테이너의 관리를 받고 있는 상태를 의미한다.
- '생성상태' -> '관리상태'로 변경하는 방법은 persist 메소드와 find 메소드를 활용할 수 있다.
- 영속 상태의 entity를 변경하게 되면 트랜잭션이 종료될 때, 영속 컨테이너가 데이터베이스에 update 작성을 처리한다.
- 이처럼 영속 컨테이너가 엔티티의 상태를 관리하여 db에 update처리 해주는 것을 더티 체킹(Dirty Checking)이라고 한다.
- 아래 소스처럼 persist 메소드를 활용하여 employee 엔티티를 등록할 수 있다.
try { Employee employee = new EMployee() ; employee.setName("둘리") ; tx.begin() ; em.persist(employee) ; tx.commit() ; } catch(Excetpion e) { e.printStackTrace() ; tx.rollback() ; } finally { em.close() ; emf.close() ; }
- find 메소드는 조회하고자 하는 엔티티가 영속 컨테이너에 존재하면 엔티티를 반환하고 없으면 DB에서 데이터를 조회하여 새로운 엔티티를 생성한다.
try { Employee employee = new EMployee() ; employee.setName("둘리") ; tx.begin() ; em.persist(employee) ; tx.commit() ; Employee findEmp = em.find(Employee.class, 1L) ; } catch(Excetpion e) { e.printStackTrace() ; tx.rollback() ; } finally { em.close() ; emf.close() ; }
3. 분리상태
- 영속 컨테이너에 있던 엔티티가 특정 작업에 의해 영속 컨테이너에서 벗어난 상태를 의미한다.
- 영속 컨테이너를 벗어난 상태라른 점에서 생성상태와 비슷하다고 생각할 수 있지만, 생성상태는 영속 컨테이너에 관리된 적이 없기 때문에 식별자 값이 없고 분리상태는 식별자 값을 가진다.
- 관리상태에서 분리상테서 전환되는 경우는 EntityManager의 detach(), clear(), close() 메소드를 호출하면된다.
메소드 의미 detach(entity) 특정 엔티티만 분리한다. clear() 영속 컨테이너를 초기화한다.
(해당 관리대상 엔티티 모두 분리상태로 변경)close() 영속 컨테이너를 종료한다.
(해당 관리대상 엔티티 모두 분리상태로 변경)* 실제 애플리케이션에서 detach나 clear메소드를 호출하는 경우는 거의 없다. 대부분 영속 컨테이너 종료를 위해 close() 메소드를 이용하는 경우가 많다.
4. 삭제 상태
- 엔티티가 영속 컨테이너에서 제거된 상태를 의미한다. 영속 컨테이너는 제거된 엔티티에 대해서 트랜잭션 종료되는 시점에 실제 DB에서도 데이터를 삭제시킨다.
try { Employee employee = new EMployee() ; employee.setName("둘리") ; tx.begin() ; em.persist(employee) ; em.remove(employee) ; tx.commit() ; } catch(Excetpion e) { e.printStackTrace() ; tx.rollback() ; } finally { em.close() ; emf.close() ; }