영속성 컨텍스트

2024. 6. 24. 17:45Java/Spring

영속성 컨텍스트(pesistent context)

  • 자바에서 객체 지향 프로그래밍과 관계형 데이터베이스를 연결하는 기술인 ORM(Object-Relational Mapping)에서 중요한 개념입니다. 주로 JPA(Java Persistence API)를 사용하는 경우에 많이 언급되는 개념이며, 데이터베이스와의 상호작용을 추상화하여 개발자가 객체를 사용하여 데이터를 관리할 수 있게 합니다.

영속성 컨텍스트의 주요 개념

 

  • 엔티티 관리:
    • 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 엔티티(Entity)를 관리합니다. 엔티티는 데이터베이스에 저장되거나 데이터베이스에서 로드되어 애플리케이션의 도메인 로직에서 사용될 수 있는 자바 객체를 말합니다.
  • 생명 주기 관리:
    • 영속성 컨텍스트는 엔티티의 생명 주기를 관리합니다. 즉, 엔티티가 생성되고, 영속화되고, 수정되고, 삭제될 때 영속성 컨텍스트가 관여하여 데이터베이스와의 일관성을 유지하고 변경 사항을 추적합니다.
  • 동일성 보장:
    • 영속성 컨텍스트는 같은 식별자(ID)를 가진 엔티티 객체가 같은 인스턴스로 유지되도록 보장합니다. 따라서 애플리케이션에서 동일한 엔티티를 여러 곳에서 조회하더라도 하나의 인스턴스만 유지됩니다.
  • 지연 로딩(Lazy Loading):
    • 영속성 컨텍스트는 지연 로딩을 지원하여 연관된 엔티티 객체가 실제로 사용될 때까지 연관된 객체를 데이터베이스에서 가져오지 않습니다. 이는 성능 최적화에 도움을 줍니다.

영속성 컨텍스트의 주요 특징

  • 트랜잭션 범위:
    • 영속성 컨텍스트는 트랜잭션 범위 내에서 동작합니다. 트랜잭션이 시작되면 영속성 컨텍스트가 생성되고, 트랜잭션이 커밋되거나 롤백될 때 영속성 컨텍스트가 제거됩니다.
  • 쓰기 지연:
    • 영속성 컨텍스트는 트랜잭션 내에서 엔티티를 수정하거나 저장하는 변경 사항을 모았다가 최적의 시점에 데이터베이스에 쓰기를 수행합니다. 이를 통해 효율적인 데이터베이스 작업을 가능하게 합니다.
  • 캐시:
    • 영속성 컨텍스트는 내부적으로 엔티티를 캐시로 관리하여 같은 엔티티에 대한 다중 조회에서 성능을 향상시킵니다. 따라서 같은 엔티티를 여러 번 로드해야 할 경우 데이터베이스에 접근하지 않고 캐시에서 바로 가져올 수 있습니다.

영속성 컨텍스트 예시

@Service
@Transactional
public class UserService {

    @Autowired
    private EntityManager entityManager;

    public void updateUser(User user) {
        // 영속성 컨텍스트에 엔티티를 저장
        entityManager.merge(user);
    }

    public User getUserById(Long userId) {
        // 영속성 컨텍스트에서 엔티티를 조회
        return entityManager.find(User.class, userId);
    }

    public void deleteUser(Long userId) {
        // 영속성 컨텍스트에서 엔티티를 삭제
        User user = entityManager.find(User.class, userId);
        entityManager.remove(user);
    }
}

 

위의 예시에서 EntityManager를 사용하여 영속성 컨텍스트를 직접 제어하고, 엔티티의 CRUD 작업을 수행하는 방법을 보여줍니다. 영속성 컨텍스트는 @Transactional 어노테이션과 함께 사용되어 트랜잭션 범위 내에서 엔티티의 변경 사항을 관리하고 데이터베이스와 동기화합니다.

 
 

'Java > Spring' 카테고리의 다른 글

[Redis] 레디스 사용 및 배포  (0) 2024.08.12
MVC (Model-View-Controller) 구조  (0) 2024.06.25
DTO, DAO, VO, Record 개념 및 차이  (0) 2024.06.24
@Controller와 @RestController 의 설명 과 차이  (0) 2024.06.24
@Transactional  (0) 2024.06.24