-
Redis에 영속성 컨텍스트의 변경 감지 개념??Spring/Data 2024. 8. 7. 16:16
시작하며
더보기CrudRepository를 활용해서 Redis의 CRUD를 실습했다. 그중 update를 하게 되면서 의문이 하나 생겼다. 실습 내용이 JpaRepository를 활용해서 CRUD를 하는 것과 비슷했기 때문에, update메서드에서 set까지만 해도 반영이 되는지 궁금했다.
다시 말해서, Redis에 영속성 컨텍스트의 변경 감지 개념이 있는지 궁금했다. 이 부분에 대해서 정리해 보겠다.
Redis의 실습 과정 중 발생한 상황임을 다시 한번 고지한다.
목차
CrudRepository를 활용한 update 메서드
update 메서드
@PutMapping("/{id}") public void update(@PathVariable String id, @RequestBody ItemOrder itemOrder) { ItemOrder target = orderRepository.findById(id).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND) ); target.setCount(itemOrder.getCount()); target.setItem(itemOrder.getItem()); target.setStatus(itemOrder.getStatus()); target.setTotalPrice(itemOrder.getTotalPrice()); // return orderRepository.save(target); }위와 같이 save를 호출하지 않고, setter로 값을 변경만 해주면 인메모리 저장소에 반영이 되는지 확인을 해봤다.

Postman으로 요청을 보냈을 때 200 OK가 떴는데도, 인메모리 저장소에는 update가 반영되지 않았다.
그래서 Redis에 영속성 컨텍스트의 변경 감지 개념이 없는 건지 찾아보게 되었다.
JPA는 영속성 컨텍스트를 사용하여 엔티티의 상태를 추적하고 관리한다. 영속성 컨텍스트 내에서 엔티티의 변경사항은 자동으로 감지되어 데이터베이스에 반영된다. 즉, 엔티티를 조회하고 setter를 통해 값을 변경하면, 트랜잭션이 종료될 때 자동으로 데이터베이스에 반영된다.
그러나, 확인 결과 Redis에는 변경 감지 개념이 없다고 한다!
그렇게 때문에 setter로 값을 변경 후 save까지 해주어야 변경된 값이 반영된다고 한다.
결론
물론 CrudRepository 등을 활용해서 인메모리 저장소의 값을 조회하거나 조작하는 것은 드물다.
보통 RedisTemplate와 ValueOperations 등을 활용해서 값을 조회 및 조작한다. ValueOperations 등으로 Redis 명령어를 메서드로 수행시키는데, update 같은 경우 그냥 set 메서드(Redis의 set역할을 하는)로 수행시킨다.
Redis의 SET은 값이 없으면 저장을 하고, 값이 있으면 그 값을 변경하여 저장시키기 때문에 영속성 컨텍스트의 변경감지라는 개념이 존재하지 않는 것 같다.
마치며
더보기공부하면서 궁금했던 부분과 그에 대한 답을 글로 정리해 보았는데, 괜찮은 것 같다. 사소한 궁금증도 계속 정리해 보겠다.