inflearn logo
강의

Course

Instructor

Complete in 6 weeks! 4 strategies to differentiate your backend resume - How to stand out among identical resumes

4-8. Lock Practice and Resolving Deadlocks

이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문

Resolved

66

cho766

26 asked

0

1. 현재 학습 진도

2. 어려움을 겪는 부분

@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);
    }
} 

java spring mysql redis 이력서

Answer 2

1

dingcodingco

cho766님 좋은 질문 해주셔서 감사합니다!!

결론부터 말씀드리면, 말씀해주신 내용이 정확합니다! 해당 코드에서 eventRepository.save(event)는 생략해도 동일하게 동작합니다.

JPA에서 영속 상태(Persistent)인 엔티티는 트랜잭션 커밋 시점에 영속성 컨텍스트가 변경 사항을 자동으로 감지합니다. findById()로 조회한 Event 엔티티는 이미 영속 상태이기 때문에, increaseParticipants()로 값을 변경하면 트랜잭션이 끝나는 시점에 자동으로 UPDATE 쿼리가 실행됩니다.

save 를 넣은 이유는 "여기서 저장이 일어난다"는 의도를 명확하게 전달하기 위한 가독성 측면이었습니다. 일부 팀에서는 "변경이 있으면 명시적으로 save()를 호출한다"는 컨벤션을 가지고 있기도 합니다.

다만 Dirty Checking을 이해하고 있다면 불필요한 save() 호출을 줄이는 것이 코드를 더 간결하게 만들 수 있어요. 중요한 건 팀 내에서 일관된 컨벤션을 유지하는 것입니다.

JPA의 동작 원리를 이해하고 있다는 점 너무 훌륭하십니다!! 언제든 편하게 질문 해주세요 좋은 하루 되시길 바랍니다

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. cho766님.

이벤트 참가자 수 증가와 관련하여 JPA의 동작에 대한 질문을 주셨군요. JPA에서 엔티티의 상태 변경이 이루어진 경우, 트랜잭션이 종료될 때 Dirty Checking을 통해 변경된 엔티티를 자동으로 반영하는 것이 일반적인 방식입니다. 그러나 해당 상황에서 eventRepository.save(event) 메서드를 명시적으로 호출한 이유에 대해 설명드리겠습니다.

이유 1: 즉시 변경 사항 반영

명시적으로 save()를 호출하면, 영속성 컨텍스트에 있는 엔티티를 강제로 플러시하여 현재 시점에서 데이터베이스에 반영할 수 있습니다. 이를 통해 JPA의 Dirty Checking에 의존하지 않고 즉시 변경사항을 적용할 수 있습니다.

이유 2: 일관 된 코드 스타일 유지

프로젝트 코딩 스타일에 따라 명시적 호출을 선호할 수도 있습니다. 특히, 팀 내 혹은 프로젝트 내에서 권장되는 스타일일 수도 있습니다.

이유 3: 변경 감지 실패 방지

만약 기존 애플리케이션 코드가 복잡하거나, 서로 다른 스트림에서 동시에 데이터 변경이 이루어져 발생할 수 있는 잠재적 충돌을 예방하기 위해 강제로 플러시되도록 설정할 수 있습니다.

참고 링크

아래 링크를 통해 더 많은 정보를 확인하실 수 있습니다. 잘못 알게 된 점을 수정하고자 할 때 링크된 문서를 더 참고하시길 권장합니다.

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

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

28

2

Build 관련 문제 (테스트 관련 문제)

0

43

2

인덱스 관련 질문 있습니다.

0

68

2

비관적 락 구현 방식 문의 건

0

70

2

외부 api 처리 방안에 대하여 궁금한 점이 있습니다.

0

89

2

네임드 락 사용 시 커넥션 풀을 분리하는 방법에 대한 질문

0

83

2

이벤트) 백엔드 기술면접 실전문제집

0

102

2

로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?

0

131

2

데드락 발생 시, 외래 키를 제거하는 방법 관련 질문

0

87

2

Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.

0

112

2

k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민

0

130

2

강의와 성능수치 비교

0

103

2

13강 강의 뒷부분의 과제 안내부분은 어디있나요?

0

51

2

[수업 자료 질문] Cache Aside의 특징 문의

0

86

2

[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의

0

81

2

블로그에 학습 내용 정리 포스트를 올려도괜찮나요?

0

110

2

멀티스레드 상황인데 currentParticipants 가 AtomicInteger가 아닌 이유?

0

88

3

클라우드 환경 배포시 부하 테스트 방식에 대하여

0

137

2

k6 dashboad 안나오는 상

0

113

2

2-4 도커 빌드 에러가 계속 납니다.

0

297

2

AWS EC2에 도커 컨테이너가 동작하지 않을 때 확인 해야하는 것

0

115

2

성능 측정시

0

111

2

API 별 실행 쿼리 모니터링 구현 질문 있습니다.

0

85

2

이력서 작성에 대한 질문

0

114

2