본문 바로가기
Spring/JPA

Entity

by y.j 2022. 5. 29.
728x90

영속성 컨텍스트

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

캐시

Request가 와서 데이터를 조회 할 때

Key로 조회한다면 1차캐시를 먼저 찾지만 Key가 아니면 DB에서 새로 조회한다.

1차 캐시에 존재한다면 데이터를 불러오고 없다면 DB를 새로 조회한다.

Entity 생명주기

비영속(new/transient)

엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 비영속(new/transient)라 한다.

@Autowired
@Transient
private UserRepository userRepository
User user = new User();

영속화(Persist)

영속성 컨텍스트에서 관리하는 상태이다. 컨텍스를 load를 할 때 정보를 snapshot으로 가지고 있다.
flush, Transaction이 끝나는 시점, JPQL이 시작하는 시점에 자동으로 DB에 반영된다.

entityManager.persist(user);                 // user가 영속화된다.
user.setName("Hello");                         // update 된다.
@Transactional
public clazz 

준영속상태(Detach)

영속성 컨텍스트에서 영속화된 객체를 관리하지 않도록 한다.

entityManager.persist(user);                 // user가 영속화된다.

entityManager.detach(user);                // 준영속화가 된다.

user.setName("Hello");                         // update 되지 않는다.

entityManager.merge(user);                 // save된다.

entityManager.flush();                          // save된다.

entityManager.clear();                         // flush가 없다면 save가 안 될 수 있다.

삭제

엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다.

entityManaget.remove(1L);

쓰기 지연

DB에 반영되는 시점과 1차 캐시에 반영되는 시점이 다를 수 있다. DB에는 반영되지 않았지만 1차 캐시에는 먼저 반영되어 flush이후에 DB와 1차 캐시의 데이터가 서로 다른 것을 쓰기 지연이라고 한다.

// set을 통해 Entity 변경
...

userRepository.findAll()          // DB와 1차 캐시 데이터가 다름

flush(), save()를 통해 반영시킨다.

// set을 통해 Entity 변경
...

userRespository.save(user);       // 또는 userRepository.flush()

userRepository.findAll()          // DB와 1차 캐시 데이터가 다름

flush

영속성 컨텍스트에 쌓여있는 EntityManager가 개발자가 원하는 시점에 반영을 안 시켜줄 수 있다.
lush를 쓰면 모든 변경사항이 DB에 적용된다. 영속성 컨텍스트도 비워버린다.

[참고]
https://velog.io/@neptunes032/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%9E%80

728x90

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

Entity의 기본속성  (0) 2022.06.05
JPA Repository  (0) 2022.06.05
JPA Programming  (0) 2022.05.01

댓글