티스토리 뷰

JPA가 어떻게 변경된 엔티티 객체를 찾는지 명확하게 이해하려면 영속성 컨텍스트라는 JPA 내부 원리를 이해해 야 한다.

이 부분은 JPA 기본편에서 자세히 다룬다.

지금은 트랜잭션 커밋 시점에 JPA가 변경된 엔티티 객체를 찾아서 UPDATE SQL을 수행한다고 이해하면 된다.

 

 

 

'스프링 DB 2편 - 데이터 접근 활용 기술' 강의의 JPA 파트에 위와 같이 '영속성 컨텍스트'가 언급되었다.

 

JPA 사용 시, entity 객체의 값을 수정하면 자동으로 db에 update된다. 어떤 원리로 작동되는건지 계속 궁금해하고 있었는데 이번 기회에 다뤄보고자 한다!

 

영속성 컨텍스트란?

영속성 컨텍스트는 JPA가 엔티티를 기반으로 데이터를 처리하는데 핵심 역할을 하는 객체로,

EntityManager가 제공하는 메서드를 통해서만 접근이 가능하다.

 

쉽게 설명을 해보면

DB와 애플리케이션 사이의 임의의 공간, 또는 객체로

DB에서 불러온 entity, 아니면 새로 저장하는 entity를 중간에서 관리해준다.

 

영속성 컨텍스트는 

DB에서 불러온 entity 객체의 필드를 수정할 경우에 

별도의 쿼리문 작성 없이 DB값까지 수정해주는 편리함을 제공한다.

(단, Transaction 어노테이션 등으로 commit 시점 제공이 필요할 수 있음)

 

 

 

 

영속성 컨텍스트의 주요 기능

엔티티 관리

애플리케이션과 데이터베이스가 상호작용하는 동안 엔티티 객체들을 관리한다.

이로 인해 엔티티 객체들과 데이터베이스는 동기화된 상태를 유지할 수 있다.

 

1차 캐시

동일 트랜젝션 내에서 같은 객체가 반복적으로 조회되는 것을 방지한다.

 

변경 감지(Dirty Checking)

엔티티 객체의 상태 변화를 감지하여, 트랜잭션이 끝날 때 자동으로 변경된 내용을 데이터베이스에 반영한다.

 

쓰기 지연

트랜잭션이 끝나는 시기까지 기다렸다가 객체의 변경된 상태를 한번에 반영한다.

 

엔티티 식별자 관리

영속성 컨텍스트에 동일 식별자를 가진 엔티티가 존재하지 않도록 관리한다. 이를 통해 데이터의 일관성을 유지할 수 있다.

 

 

CRUD 예제

아래 코드는 강의에서 제공된 코드를 조금 더 간단한 버전으로 수정한 것이다. 

 

위에서 언급된 EntityManager 객체를 직접사용하는 코드인데

다음 강의에서 나오는 Spring Data JPA를 사용하면 해당 부분도 불필요하다.

얼른 다음 강의도 들어보고 싶..다... 하지만 조금 지친거 같기도... 끝까지 화이팅...

@Repository
@Transactional
public class ItemRepository {
    @PersistenceContext
    private EntityManager em;

    // Create
    public Item save(Item item) {
        em.persist(item);
        return item;
    }
    
    // Read 
    public Optional<Item> findById(Long id) {
        Item item = em.find(Item.class, id);
        return Optional.ofNullable(item);
    }

    // Read: jpql 사용, 동적 쿼리 작성에 한계
    public List<Item> findAll() {
        String jpql = "select i from Item i";
        return em.createQuery(jpql, Item.class).getResultList();
    }

    // Update
    public void update(Long itemId, Item updateParam) {
        Item findItem = em.find(Item.class, itemId);
        if (findItem != null) {
            findItem.setItemName(updateParam.getItemName());
            findItem.setPrice(updateParam.getPrice());
            findItem.setQuantity(updateParam.getQuantity());
        }
    }

    // Delete by ID
    public void deleteById(Long id) {
        Item item = em.find(Item.class, id);
        if (item != null) {
            em.remove(item);
        }
    }
}

 

코드를 돌려보고 싶은데 EntityManager bean을 찾을 수가 없어서... 돌아가지 않는다.

버전도 다 맞췄는데 왜 안되지... 여튼 끝...~

 

 

 

이미지 출처: 영속성 컨텍스트 이미지

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함