더티체킹에 궁금한 점이 있습니다.
119
작성한 질문수 29
public void updateUserName(Long userId, String newName) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new CustomException("User not found with id: " + userId));
user.setName(newName);
userRepository.save(user);
}
여기서 findById로 인해 영속성 컨텍스트에 user가 올라가있어서 setName만 해줘도 더티체킹으로 인해서 저장되는 걸로 알고있습니다.
그러면 userRepository.save(user);를 따로 해줘야하나요?
답변 2
0
안녕하세요. kongminoo님, 공식 서포터즈 코즈위버입니다.
말씀하신것처럼 영속성 컨텍스트는 더티체킹을 지원하기에 트랜잭션이 끝나는 시점에 flush 하여 데이터베이스와 동기화를 진행합니다.
그래서 별도로 save 메서드를 호출하지 않아도 됩니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. kongminoo님.
질문하신 내용은 스프링 데이터 JPA에서의 영속성 컨텍스트와 더티 체킹에 관한 사항입니다. 영속성 컨텍스트에 엔티티가 존재하는 경우, 해당 엔티티의 상태가 변경되면 JPA는 이를 감지(더티 체킹)하여 트랜잭션이 커밋될 때 자동으로 데이터베이스에 업데이트 쿼리를 전송합니다. 즉, 이 경우에는 userRepository.save(user);를 별도로 호출하지 않아도 됩니다.
추가 설명
User엔티티를findById로 조회한 후,setName을 통해 속성을 변경하면, 이 엔티티는 여전히 영속성 컨텍스트 내에 존재하게 됩니다.
- 트랜잭션 내에서는
setXXX등으로 객체의 내부 상태가 변경된 것을 JPA가 탐지하고, 트랜잭션 종료 시점(커밋 시점)에 해당 변경 사항을 데이터베이스에 반영합니다.
관련 내용 참고
더 깊이 있는 이해를 원하시면 아래의 게시물들을 참고하시는 것도 좋습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?
0
77
1
existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?
0
109
3
MemberRepository 구현체
0
61
1
pdf 표현 질문드립니다.
0
64
1
로그가 남지 않는 문제.
0
86
1
테스트 라이브러리가 강의는 junit4가 맞나요??
0
73
2
pdf 파일과 차이점이 있는 것같은데 문제 없나요?
0
73
2
@PrePersist, @PreUpdate 호출 시점 질문드립니다.
0
95
2
Sort 인터페이스는 잘 사용 안하나요?
0
52
1
스캔대상 질문드립니다.
0
46
1
하이버네이트6에서의 최적화에 이은 질문
0
88
1
save() vs saveAndFlush DB 통신 횟수
0
55
1
순수 JPA 리포지토리 코드 수정부분
0
87
2
bulk연산 후 flush하는 이유를 모르겠어요
0
153
3
bulk insert 질문입니다.
0
184
2
교만했던 것 같아요.
0
147
1
RESTful 강의는 안하시는 건지 궁금합니다.
0
150
2
동적 테이블에 대한 질문
0
87
1
영속성 전이와 연관관계
0
132
2
강의 10:25 질문
0
75
1
단건 update 질문
0
98
2
엔티티 와 도메인의 경계
0
129
1
UsernameOnlyDto 타입 type mismatch 오류
0
122
1
Projection 개념과 데이터 전달과정에 대해 질문 있습니다.
0
137
1





