영속성 컨텍스트가 뭔가요?

박재성·2025년 1월 6일
0

Spring

목록 보기
4/4

📌영속성 컨텍스트()란?

간단히 말해서 영속성 컨텍스트는 JPA가 관리하는 "엔티티를 저장하는 가상 공간"이예요. 여기서 "가상 공간"이란, 메모리 상에서 엔티티(객체)를 관리하는 영역을 뜻합니다. 데이터베이스(DB)와 직접적으로 소통하기 전에 JPA가 엔티티를 임시로 관리하는 역할을 해요.

⭐왜 영속성 컨텍스트가 필요할까?

🌟그냥 데이터베이스에 직접 저장하거나 불러오면 되는 거 아닌가? 라는 생각이 들 수도 있어요. 하지만 영속성 컨텍스트가 있으면 이런 장점이 있어요.

- 1차 캐시
영속성 컨텍스트는 엔티티를 1차 캐시에 저장해요.
→ 동일한 엔티티를 여러 번 조회하더라도 데이터베이스를 반복해서 조회하지 않고, 1차 캐시에 있는 데이터를 사용해 성능을 높여줘요.

- 변경 감지(Dirty Checking)
엔티티의 값을 변경하면 JPA가 자동으로 감지해서 데이터베이스에 반영해 줘요.
→ 별도의 쿼리를 작성하지 않아도 변경된 내용을 업데이트할 수 있어요.

- 동일성 보장
같은 트랜잭션 안에서는 동일한 엔티티를 반환해요.
→ 객체의 일관성을 유지할 수 있어요.

🌟영속성 컨텍스트의 상태는 다음과 같이 4가지가 있어요.

- 비영속 (Transient)
아직 영속성 컨텍스트에 관리되지 않는 상태예요.
예: new 키워드로 객체를 생성한 직후.

- 영속 (Persistent)
영속성 컨텍스트에서 관리되는 상태예요.
예: EntityManager.persist()를 호출한 후.

- 준영속 (Detached)
영속성 컨텍스트에서 분리된 상태예요.
예: EntityManager.detach()를 호출한 경우.

- 삭제 (Removed)
영속성 컨텍스트와 데이터베이스에서 삭제 예정인 상태예요.
예: EntityManager.remove()를 호출한 경우.

🌟영속성 컨텍스트가 없다면?

만약 영속성 컨텍스트가 없다면, 데이터베이스와 매번 직접 소통해야 해요. 동일한 엔티티를 여러 번 조회하거나 수정할 때 성능이 떨어지고, 변경 사항을 반영하기 위해 번거롭게 SQL 쿼리를 작성해야 할 거예요. 영속성 컨텍스트 덕분에 우리는 더 간편하고 효율적으로 객체를 관리할 수 있답니다!

⭐액션 큐

🌟엑션큐가 뭔가요?

액션 큐는 영속성 컨텍스트에서 발생한 데이터 변경 작업(insert, update, delete 등)을 모아두는 일종의 작업 대기열이예요. 트랜잭션이 커밋되거나 flush()가 호출될 때, 이 큐에 저장된 작업들이 데이터베이스에 순차적으로 반영됩니다.

❓배우며 궁금했던 것들

📚영속성 컨텍스트를 사용할 때 commit을 하면 가상공간 내에 있던 데이터를 지우고 DB로 옮기는건가요? 아니면 그대로 두고 DB로도 보내는건가요?

📖해답
commit은 영속성 컨텍스트의 데이터를 지우지 않고, 데이터베이스에 반영해요.
영속성 컨텍스트는 여전히 데이터를 관리하고 있으므로 이후에도 데이터를 조회하거나 수정할 수 있습니다 :)

📚flush와 commit의 차이가 뭐야?

📖해답
flush(): 영속성 컨텍스트의 변경사항을 데이터베이스에 반영하지만 트랜잭션은 유지되어요!
commit(): flush()를 호출하고 트랜잭션을 종료해요!

0개의 댓글