인프런 커뮤니티 질문&답변
이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문
해결된 질문
작성
·
39
0
1. 현재 학습 진도
몇 챕터/몇 강을 수강 중이신가요? 4-8강
2. 어려움을 겪는 부분
어느 부분에서 막히셨나요?
chapter4/_2_event_with_participant폴더의EventJoinService객체의 메서드 코드에 대한 질문입니다.
코드의 어떤 로직이 이해가 안 되시나요?
@Transactional
public void joinEvent(Long eventId, Long memberId) {
Event event = eventRepository.findById(eventId)
.orElseThrow(() -> new EntityNotFoundException("이벤트를 찾을 수 없습니다."));
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new EntityNotFoundException("회원을 찾을 수 없습니다."));
// save()를 호출하지 않아도 Dirty Checking에 의해 Update 쿼리가 나가지 않나요?
event.increaseParticipants();
eventRepository.save(event);
EventParticipant participant = EventParticipant.builder()
.event(event)
.member(member)
.build();
participantRepository.save(participant);
}
} 코드 블럭의 주석 란에 질문을 적어놓았습니다. 저 상황에서
save()를 호출하는 이유가 궁금합니다.JPA 엔티티의 상태 변경분에 대한 쿼리는 트랜잭션 커밋 후, 자동으로 나가는 것으로 알고 있습니다. 혹시, 제가 잘못 알고 있는건지 궁금합니다.
답변 2
1
cho766님 좋은 질문 해주셔서 감사합니다!!
결론부터 말씀드리면, 말씀해주신 내용이 정확합니다! 해당 코드에서 eventRepository.save(event)는 생략해도 동일하게 동작합니다.
JPA에서 영속 상태(Persistent)인 엔티티는 트랜잭션 커밋 시점에 영속성 컨텍스트가 변경 사항을 자동으로 감지합니다. findById()로 조회한 Event 엔티티는 이미 영속 상태이기 때문에, increaseParticipants()로 값을 변경하면 트랜잭션이 끝나는 시점에 자동으로 UPDATE 쿼리가 실행됩니다.
save 를 넣은 이유는 "여기서 저장이 일어난다"는 의도를 명확하게 전달하기 위한 가독성 측면이었습니다. 일부 팀에서는 "변경이 있으면 명시적으로 save()를 호출한다"는 컨벤션을 가지고 있기도 합니다.
다만 Dirty Checking을 이해하고 있다면 불필요한 save() 호출을 줄이는 것이 코드를 더 간결하게 만들 수 있어요. 중요한 건 팀 내에서 일관된 컨벤션을 유지하는 것입니다.
JPA의 동작 원리를 이해하고 있다는 점 너무 훌륭하십니다!! 언제든 편하게 질문 해주세요 좋은 하루 되시길 바랍니다
0
안녕하세요, 인프런 AI 인턴입니다. cho766님.
이벤트 참가자 수 증가와 관련하여 JPA의 동작에 대한 질문을 주셨군요. JPA에서 엔티티의 상태 변경이 이루어진 경우, 트랜잭션이 종료될 때 Dirty Checking을 통해 변경된 엔티티를 자동으로 반영하는 것이 일반적인 방식입니다. 그러나 해당 상황에서 eventRepository.save(event) 메서드를 명시적으로 호출한 이유에 대해 설명드리겠습니다.
이유 1: 즉시 변경 사항 반영
명시적으로 save()를 호출하면, 영속성 컨텍스트에 있는 엔티티를 강제로 플러시하여 현재 시점에서 데이터베이스에 반영할 수 있습니다. 이를 통해 JPA의 Dirty Checking에 의존하지 않고 즉시 변경사항을 적용할 수 있습니다.
이유 2: 일관 된 코드 스타일 유지
프로젝트 코딩 스타일에 따라 명시적 호출을 선호할 수도 있습니다. 특히, 팀 내 혹은 프로젝트 내에서 권장되는 스타일일 수도 있습니다.
이유 3: 변경 감지 실패 방지
만약 기존 애플리케이션 코드가 복잡하거나, 서로 다른 스트림에서 동시에 데이터 변경이 이루어져 발생할 수 있는 잠재적 충돌을 예방하기 위해 강제로 플러시되도록 설정할 수 있습니다.
참고 링크
아래 링크를 통해 더 많은 정보를 확인하실 수 있습니다. 잘못 알게 된 점을 수정하고자 할 때 링크된 문서를 더 참고하시길 권장합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




