이 객체들은 데이터베이스와의 매핑 정보를 가지고 있으며, JPA를 통해 데이터베이스의 상태와 동기화 된다.
엔티티의 라이프사이클은 영속/비영속/준영속/분리/삭제 상태로 관리 된다.
영속 컨텍스트
영속 컨텍스트는 엔티티를 영구적으로 저장하는 환경을 의미한다.
이는 일종의 버퍼로서, 데이터베이스와 응용 프로그램 사이에서 엔티티의 생명주기를 관리한다.
영속 상태의 엔티티에 대한 조회나 변경이 발생할 경우 컨텍스트에 저장(캐싱)된 엔티티를 사용한다.
트랜잭션을 커밋하는 시점에 엔티티의 상태를 체크하여 적절한 쿼리를 자동으로 생성 후 실행하여 실제 테이블에 결과를 반영한다.
EntityManager
엔티티에 대한 영속성 관리를 담당한다.
persist()
엔티티를 영속 컨텍스트에 추가한다.
새로운 엔티티를 생성하고 데이터베이스에 저장할 때 사용한다.
이때 엔티티는 영속 상태가 된다.
find()
주어진 엔티티 클래스와 기본 키를 사용하여 데이터베이스에서 엔티티를 조회한다.
이때 엔티티는 영속 상태가 된다.
만약 이미 영속 상태의 엔티티가 있으면 해당 값을 반환한다.
remove()
영속 컨텍스트에 있는 엔티티를 제거한다.
엔티티를 데이터베이스에서 삭제할 때 사용한다.
이때 엔티티는 삭제 상태가 된다.
detach()
엔티티를 영속 컨텍스트에서 분리한다.
엔티티를 더 이상 관리하지 않도록 할 때 사용한다.
이때 엔티티는 준영속 상태가 된다.
:question: 비영속 상태와 준영속 상태의 차이점은 무엇입니까?
- `비영속 상태` : 엔티티는 새로 생성되었지만 아직 EntityManager에 의해 관리되지 않는 상태
- `준영속 상태` : 영속 상태는 엔티티가 이전에 영속 상태였으나, 현재는 영속 컨텍스트에서 분리된 상태
:question: detach 메소드를 호출하여 준영속 상태를 만들어야 하는 이유는 무엇입니까?
- `자원 관리` : 대량의 엔티티를 영속 상태로 두게 되면 많은 메모리가 필요하기 때문에 쓰임이 완료된 엔티티를 detach 하여 메모리를 효율적으로 관리 할수 있다.
- `데이터 유지` : 엔티티의 값이 변경되지 않도록 하기 위해 detach 하고 필요할때 다시 가져와서 사용(merge)하는 경우.
merge()
영속 상태의 엔티티를 다시 영속 상태로 만든다.
:question: merge 메소드의 처리과정은?
- JPA는 이 준영속 엔티티의 식별자(ID)를 사용하여 현재 영속 컨텍스트에서 같은 식별자를 가진 엔티티를 찾는다.
- 같은 식별자를 가진 엔티티가 존재한다면 준영속 엔티티의 값으로 갱신한다.
- 없다면 새로운 엔티티를 생성하고 준영속 엔티티의 값을 복사한 다음 영속 컨텍스트에 추가한다.
- `주의할 점`
- merge 는 엔티티 내의 모든 값에 대한 병합 처리를 하기 때문에 복잡한 엔티티의 경우 처리하는데 비용이 많이 발생 할 수 있다. 그러므로 변경된 부분만 따로 업데이트 처리하는 것이 더 나은 선택일 수 있다.
- 그리고 merge 처리 후 반환된 엔티티를 사용해야 한다. 앞서 설명했듯 내부적으로 새로운 엔티티를 생성하고 영속 컨텍스트에 추가 되는 경우가 있기 때문이다.
영속 엔티티
영속 컨텍스트
EntityManager
persist()
find()
remove()
detach()
:question: 비영속 상태와 준영속 상태의 차이점은 무엇입니까?
- `비영속 상태` : 엔티티는 새로 생성되었지만 아직 EntityManager에 의해 관리되지 않는 상태 - `준영속 상태` : 영속 상태는 엔티티가 이전에 영속 상태였으나, 현재는 영속 컨텍스트에서 분리된 상태:question: detach 메소드를 호출하여 준영속 상태를 만들어야 하는 이유는 무엇입니까?
- `자원 관리` : 대량의 엔티티를 영속 상태로 두게 되면 많은 메모리가 필요하기 때문에 쓰임이 완료된 엔티티를 detach 하여 메모리를 효율적으로 관리 할수 있다. - `데이터 유지` : 엔티티의 값이 변경되지 않도록 하기 위해 detach 하고 필요할때 다시 가져와서 사용(merge)하는 경우.merge()
:question: merge 메소드의 처리과정은?
- JPA는 이 준영속 엔티티의 식별자(ID)를 사용하여 현재 영속 컨텍스트에서 같은 식별자를 가진 엔티티를 찾는다. - 같은 식별자를 가진 엔티티가 존재한다면 준영속 엔티티의 값으로 갱신한다. - 없다면 새로운 엔티티를 생성하고 준영속 엔티티의 값을 복사한 다음 영속 컨텍스트에 추가한다. - `주의할 점` - merge 는 엔티티 내의 모든 값에 대한 병합 처리를 하기 때문에 복잡한 엔티티의 경우 처리하는데 비용이 많이 발생 할 수 있다. 그러므로 변경된 부분만 따로 업데이트 처리하는 것이 더 나은 선택일 수 있다. - 그리고 merge 처리 후 반환된 엔티티를 사용해야 한다. 앞서 설명했듯 내부적으로 새로운 엔티티를 생성하고 영속 컨텍스트에 추가 되는 경우가 있기 때문이다.close()