My Blog

스프링부트 JPA update,save에 대해서 본문

카테고리 없음

스프링부트 JPA update,save에 대해서

JAESG 2023. 6. 10. 00:31

댓글 수정 기능을 구현하다가 처음에는 댓글을 수정하려는 Comment에 객체를 받아와서 다시 저장하는 방식을 했었다.

 

    public Comment update(Comment comment) {
        
        return commentRepository.save(comment);
    }

 하지만 이렇게 하면 DB에 반영을 해줘야하기 때문에 영속성 컨텍스트, 더티 체킹을 제대로 활용하지 못하고 결국 비효율적이라는 판단이 된다.

    @Transactional
    public Comment update(Long id, String content) {
        Comment updateComment = findOne(id);
        updateComment.setContent(content);
        return updateComment;
    }

이 코드가 동작하는 이유는 JPA는 더티체킹을 지원한다.

JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영함.

JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태를 스냅샷으로 만들어서 저장함.

트랜잭션이 끝나는 시점에 스냅샷과 비교해서 변경이 있으면 Update Query를 발생 시킴

더티 체킹 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용한다.

 

따라서 댓글을 조회했으니 조회 상태를 스냅샷으로 저장하고.

그 값을 변경시켰고, 트랜잭션이 끝났으니 변경 사항을 update Query를 보낸 것이다.

 

더티 체킹으로 인한 update는 모든 필드에 대해서 업데이트가 된다

모든 필드가 업데이트 된 상황

엔티티에 필드가 20~30개가 넘어가면 업데이트를 할 때 부담스러울 수 있다.

그럴때는 @DynamicUpdate 어노테이션을 엔티티에 달아주자.

내용과 수정 날짜만 업데이트 된 상황

 

728x90
Comments