들어가기에 앞서
Spring Boot 개발을 하면서 JPA를 활용하여 개발을 하지만 JPA에서 Entity가 어떻게 관리되는지 얕게 공부한터라 다시 한번 상기하고, 더불어 면접 질문에 대해 대비하려고 한다.
JPA에서 Entity는 여러 Life Cycle(생명 주기) 단계 를 거치며, 각각의 단계는 Entity가 DB어떻게 상호작용하는지를 결정한다.
크게 New 상태, Managed 상태, Detached 상태, Removed 상태로 4가지로 나뉜다.
1. NEW(Transient)상태
Entity가 아직 영속성 컨텍스트에 의해 관리되지 않는 상태이다.
특징
- DB에 저장되지 않은 상태
- 아직 EntityManager를 통해 persist()메소드가 호출되지 않은 상태이다.
MyEntity entity = new MyEntity();
entity.setName("Sample");
// 이 상태에서 entity는 New 상태
2. Managed(Persistent)상태
Entity가 영속성 컨텍스트의 의해 관리되고 있는 상태이다.
특징
- EntityManager를 통해 persist()가 메소드가 호출된 후 해당 상태가 된다.
- 영속성 컨텍스트에 의해 변경 사항이 추적되며, Trasaction이 Commit될 때 자동으로 DB에 반영된다.
- 동일한 Entity를 여러 번 저장하지 않는다.
여기서 동일한 Entity를 여러 번 저장하지 않는 이유는 1차 캐시의 존재 덕분이다.
EntityManager가 관리하는 Entity 상태를 추적하고, 1차 캐시는 영속성 컨텍스트가 Entity를 메모리에 저장해두는 메커니즘이다.
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
MyEntity entity = new MyEntity();
entity.setName("Sample");
em.persist(entity); // 이제 entity는 Persistent 상태입니다.
em.getTransaction().commit();
3. Detached 상태
Entity가 한 번 영속성 컨텍스트의 의해 관리되었으나, 현재는 더 이상 관리되지 않는 상태이다.
특징
- 영속성 컨텍스트가 닫히거나, clear(), detach() 메소드가 호출될 때 발생한다.
- DB에 반영되지 않는다.
- 이 상태의 Entity를 다시 관리하려면 merge()메소드를 사용해야 한다.
em.close(); // 또는 em.clear(); 혹은 em.detach(entity);
// 이제 entity는 Detached 상태입니다.
4. Removed 상태
Entity가 DB에서 삭제될 예정인 상태이다.
특징
- EntityManger를 통해 remove() 메소드가 호출된 상태이다.
- 영속성 컨텍스트에서는 여전히 관리되지만, Trsaction이 Commit되면 DB에서 삭제된다.
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
MyEntity entity = em.find(MyEntity.class, 1L);
em.remove(entity); // 이제 entity는 Removed 상태입니다.
em.getTransaction().commit();
면접 질문 대비
1. JPA에서 Entity의 Life Cycle은 어떻게 이루어지나?
- 다음과 같이 이루어진다.
1. New 상태
- Entity가 생성되었지만 영속성 컨텍스트의 포함되지 않은 상태이다. 즉 DB에도 저장되지 않는 상태이다.
2. Managed 상태
- 영속성 컨텍스트에 포함되어 관리되는 상태이다. Entity는 변경 사항이 자동 추적되며, Transaction이 Commite되면 DB에 반영된다.
3. Detached 상태
- 영속성 컨텍스트가 닫히거나 한다면 더 이상 영속성 컨텍스트에 의해 관리되지 않는다. Entity가 DB와 연결을 잃지만 여전히 메모리 상에 존재한다.
4. Removed 상태
- Transaction이 Commit되면 해당 Entity는 DB에서 삭제된다.
2. JPA에서 Persist() 메서드는 무엇을 하는 메서드인가?
- Persist()메서드는 생성된 Entity를 영속성 컨텍스트의 포함하도록 하는 메소드이다. 이 메서드는 EntityManager를 통해 호출할수 있다.
3. JPA에서 Entity의 상태(State)전이는 어떻게 이루어지나?
1번 대답에서 잘 엮어 말하면 될 듯하다.
4. JPA에서 Flush() 메서드는 무엇을 하는 메서드인가요?
- Flush()메서드를 호출하면서 영속성 컨텍스트에 있는 모든 변경 내용을 DB에 반영함 즉, 영속성 컨텍스트와 DB간의 동기화를 수행함
- 즉시 DB에 반영하고 싶은 경우
5. JPA에서 Entity를 캐시하는 방법은 무엇인가?
- 1차 캐시, 2차캐시를 이용해 엔티티를 관리한다.
1차캐시는 영속성 컨텍스트에 의해 관리된다.
2차캐시는 영속성 컨텍스트와 독립적으로 존재한다.
6. Hibernate에서 1차 캐시와 2차 캐시의 차이점은?
- 1차 캐시는 영속성 컨텍스트에 의해 관리되며(EntityManger) 생명 주기 동안만 유효
- 2차캐시는 독립적으로 존재한다. 2차캐시는 애플리케이션 전체에서 공유
7. JPA에서 EntityManger란 무엇인가요?
- 영속성 컨텍스트가 저장되면 EntityManger를 통해 관리할수 있습니다. JPA에서 Entity와 관련된 DB 작업을 관리하는 인터페이스이다.
이를 통해 애플레키연은 영속성 컨텍스트를 제어하거나 엔티티를 저장하거나 할 수 있다.
8. JPA에서 영속성 컨텍스트란?
- 영속성 컨텍스트는 JPA에서 엔티티 객체를 관리하고 DB와 상호작용을 할수 있도록 도와주는 일종의 1차캐시이다.
참고
*면접 질문
'스프링 > JPA' 카테고리의 다른 글
[JPA] EAGER Loading Vs LAZy Loading N+1이란? (0) | 2024.08.27 |
---|---|
[Spring] JPA Save메소드를 이용한 양방향 매핑 (Gradle) (0) | 2023.01.23 |
[Spring] JPA란 무엇인가 (1) | 2023.01.18 |