inflearn logo
강의

Course

Instructor

Real-world! Spring Boot and JPA Utilization 1 - Web Application Development

merge 질문이 있습니다.

Resolved

372

dlkfjan

7 asked

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을 사용하라고 하신 것인지 궁금합니다!

 

java spring 웹앱 spring-boot jpa

Answer 2

1

dlkfjan

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

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

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

1

y2gcoder

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

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

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

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

0

communityai8509

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

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

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

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

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

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

sdk 설정 오류

0

48

2

오탈자 - @Transactional

0

54

1

src/test/resources 테스트 경로 문제

0

49

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

62

1

MemberRepositoryTest 실행오류

0

77

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

183

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

137

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

50

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

71

1

기본 생성자

0

59

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

100

1

멤버서비스테스트 부분에서 막힙니다.

0

163

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

115

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

117

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

111

1

24분 27초 연관관계 편의 메서드 위치

0

112

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

107

2

빌드 툴, Gradle

0

57

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

73

2

Repository에서 EntityManager 주입 방식 차이

0

87

1

롬복과 사용자 정의 setter 메서드

0

70

1

주문 목록 조회 fetch join 질문드립니다

0

80

1

dirty checking 질문드립니다.

0

80

1

동시성 관련 질문입니다

0

72

1