Spring-Boot

Spring Data JPA를 활용한 Update 처리(변경감지, 더티체킹)

뚜코맨 2024. 4. 13. 00:01

 

최근 Spring Data JPA를 사용하며 SSR 방식으로 개발중이다. 게시글 정보를 수정하는 Update 로직을 처리 하려고 한다

 

JPA에서 Update 처리 로직을 보기 전에 변경감지(더티체킹)이 뭔지 알아보자

 

더티체킹이란?

Transaction안에서 엔티티의 변경이 일어나면 변경내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다.

게시글을 관리하는 BoardService의 updateBoard 메서드이다.

 

우리가 생각하는 JPA를 활용한 쿼리 처리는 JPARepository를 상속받고 있는 boardReporitory 인터페이스에서

JPA에서 제공해주는 기본 메서드인 findAll(), deleteById() 등 이런 메서드를 사용하여 update도 똑같이 처리를 할거라고 생각하겠지만, 소스를 보면 update에 관한 JPA에서 제공해주는 추상 메서드는 호출하지 않는다.

 

🤷‍♂️ 그럼 어떻게 처리를 할 수 있는 건가?

💡 JPA에서는 트랜잭션이 끝나는 시점의 변화가 있는 모든 엔티티 객체를 데이터베이스게 자동으로 반영해준다!!

(이때 변화가 있다의 기준은 최초 조회 상태이다.)

 

1. JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만들어놓는다.

2. 그리고 트랜잭션이 끝나는 시점에 이 스냅샷과 비교하여 다른 부분이 있다면 Update 쿼리를 데이터베이스로 전달한다.

이런 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용된다.

* 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기 위해서는 식별자 값이 반드시 필요하다.(기본키 매핑)

그럼 더티체킹을 쓰기 위해선 JPA 사용하는 환경에서
setXxx() 또는 builder.build()로 값의 변경만 존재하면 되는 것인가?

아니다.

 

 

변경감지를 사용하기 위해선 트랜잭션안에 있어야 하기 때문에 Service 클래스 안에 @Transactional 이라는 어노테이션이 추가되어야한다.

 

그럼 실제로 수정작업을 했을때 어떻게 로그가 찍히는 지 보자.

 

수정 버튼을 누르게 되면 일단 최초 조회(select) 쿼리를 보내게 된다.

 

 

수정을 하기 전 select를 한 값과 유저가 보낸 수정 request data가 변경된 부분이 있으면 이렇게 Update 쿼리가 나가는 걸 볼 수 있다.

 

이렇게 오늘은 JPA의 변경감지, 더티-체킹을 알아보았다. 앞으로 프로젝트 개발을 하면서 정리가 필요한 부분들은 이렇게 따로 정리를 해봐야겠다.