인프런 커뮤니티 질문&답변

dlkfjan님의 프로필 이미지
dlkfjan

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

merge 질문이 있습니다.

해결된 질문

작성

·

270

·

수정됨

0

안녕하세요 영한님! 강의를 듣던 중 궁금한 점이 생겨서 질문 남깁니다.

 

프로젝트를 진행하며 Spring Data JPA를 사용하면서 Entity를 update 하는 방법에 대해서 고민이 생겼습니다.

findById를 한 후 save() 메서드를 호출하는 방법과

public Post updatePost(long postId, PostUpdateRequest request) {

    Post post = findById(postId);
    post.update(request.getTitle(), request.getContent());

    return postRepository.save(post);
}

 

 

영한님이 말씀하신 dirty checking 을 이용하는 방법 중 어떤게 더 나은 방법인지 궁금해서요.

@Transactional
public void updatePost(long postId, PostUpdateRequest request) {

    Post post = findById(postId);
    post.update(request.getTitle(), request.getContent());
}

 

spring data jpa 의 save() 메서드의 경우 새로운 엔티티일땐 em.persist()

존재하는 엔티티일땐 em.merge() 방식으로 동작한다고 알고 있습니다.

 

findById를 통해 엔티티를 조회해서 영속상태로 만든 후 em.merge를 하게 된다면 dirty checking을 통해 엔티티를 update하는 것과 어떤 차이가 있는건지 궁금합니다.

 

@Transactional을 사용해서 리소스를 사용하는것 보단, save 메서드 호출을 통해 em.merge()를 사용하는게 더 나은 방법이 아닌지,

혹은 update 하는 동안의 트랜잭션은 큰 리소스 사용 없이 동작하기 때문에 dirty checking을 사용하라고 하신 것인지 궁금합니다!

 

답변 2

1

dlkfjan님의 프로필 이미지
dlkfjan
질문자

image다른 질문글을 통해서 답변 확인했습니다!

merge 의 원래 목적은 준영속 상태의 엔티티를 영속 상태로 변경하는 것이고,

dirty checking의 경우 엔티티를 업데이트 하는 용도로 사용하는 것으로 이해하면 되는걸까요?

안녕하세요. Birdie님, 공식 서포터즈 y2gcoder입니다.

스스로 잘 해결하셨습니다 :) 

그렇게 이해하시는 게 맞습니다!

강의 수강 중 강의 관련 궁금한 사항은 언제든 질문 남겨주세요^^

0

안녕하세요, 인프런 AI 인턴입니다. Birdie님의 궁금증을 해결하기 위해 몇 가지 유사한 질문에 대한 답변을 찾아봤습니다.

영한님의 강의에서 언급되었듯이, 일반적으로 엔티티를 수정할 때에는 변경 감지(Dirty Checking)를 사용하는 것이 권장됩니다. 이유는 변경 감지를 사용하면 영속 상태의 엔티티의 필드 값만 변경하면 트랜잭션이 끝나는 시점에 해당 변경이 데이터베이스에 자동으로 반영되기 때문입니다. 반면 save() 메서드를 사용할 경우에는 존재하는 엔티티에 대해서는 merge()가 호출되는데, 이는 준영속 상태의 엔티티를 영속 상태로 전환하는데 사용되며, 수정 시 일부 필드가 누락될 경우 그 필드들이 null로 업데이트 될 위험이 있습니다.

해당 문제에 대해 영한님께서 직접 답변해 주신 내용들 중에서도 유사한 상황에 대한 답변이 존재합니다. 다음은 그 중 일부 답변 링크입니다:

이 답변들에서 save() 메서드와 merge()에 대한 전략, 그리고 변경 감지에 대한 설명이 자세히 나와 있으므로 참고하시면 도움이 될 것입니다.

영한님은 save() 메서드를 사용할 때 주의할 점을 지적하고, 가능하면 변경 감지를 사용하는 것을 권장하셨습니다. 이미 ‘findById’를 통해 조회된 영속 상태 엔티티일 경우, 변경 감지를 사용하는 것이 더 나은 방법이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dlkfjan님의 프로필 이미지
dlkfjan

작성한 질문수

질문하기