[Spring Data JPA] 데이터 수정 / Dirty checking 시 save를 별도로 해줘야 한다 ?

2023. 4. 13. 18:06JPA

[문제]

update로 entity의 값을 바꿔주기만 해도 수정이 되는 것은 알고 있지만, 만약 PostRepository의 구현체를 JPA가 아닌 MyBatis 등으로 바꾼다면 ?

그럼 DB에 수정된 값이 들어가지 않을 것이다. 이 상황은 OCP를 어기고 있다.

 

그래서 save를 통해 한 번 더 수정값을 저장해주는 코드를 반영하였다.

 

그런데 이렇게 되면 JPA는 어떤식으로 작동할까 의문이었다.

 

간단히 정리하면 영속성 매니저가 merge라는 메서드를 호출하며 수정 작업이 이루어진다.

이 과정에서 오버헤드가 발생할 수 있기 때문에 비효율적일 수도 있다.

 

[해결]

HibernateRepository 를 JpaRepsitory와 함께 상속받아서 update 메서드를 사용한다.

이렇게 하면 성능에도 좋다고 한다.

 

규모가 큰 프로젝트가 아니고서는 save 를 따로 해준다고 큰 부하가 가진 않을 것이라고 생각하기 때문에 save를 그대로 쓸 생각이다. Dirty checking을 몰라서 save를 해주는게 절대 아니다.

 

현재 상황에 HibernateRepository에 대해서 깊게 공부하는 것은 중요도가 높지 않다고 생각하기 때문에 알아만 두어야겠다.

 

 

예시 코드

@Service
@Transactional
public class UpdatePostService {
    private final PostRepository postRepository;
 
    public UpdatePostService(PostRepository postRepository) {
        this.postRepository = postRepository;
    }
 
    public void update(Long postId, String title, String content) {
        var post = this.postRepository.findById(postId).orElseThrow();
        post.update(title, content);
        this.postRepository.save(post); // <-- explicit save
    }
}
 
interface PostRepository extends JpaRepository<Post, Long>, HibernateRepository<Long> {
}