inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

트래픽 급증을 견디는 서버 시스템 설계 - Coupon 발급 서비스

[실습] Redis Lua로 빠르고 정확하게 발급하기

@Modifying에 관하여

해결된 질문

55

Gomgomi

작성한 질문수 7

1

안녕하세요

이번 강의에서 @Modifying 이라는 어노테이션을 사용하고 있는데

이 @Modifying을 사용하는 상황이 발생하면 영속성 컨텍스트에 있는 데이터와 차이가 발생하게 되는 것을 알게 되었습니다.

이를 해결하기 위해 clearAutomatically = true, flushAutomatically = true 이런 옵션들이 있는 것으로 알고있는데,

현업에서는 이러한 옵션들을 어떻게 사용하는지 궁금합니다.


Modifying을 쓰면 영속성 컨텍스트와 차이가 발생한다는 것을 인지하기 때문에 저런 옵션들을 따로 설정을 안하는지,
아니면 저런 옵션들을 사용하는지 궁금합니다!

java kotlin mysql docker spring-boot kafka redis

답변 1

1

한조각

안녕하세요! Gomgomi 님

좋은 질문 감사드립니다. 실무에서도 clearAutomatically, flushAutomatically 옵션을 사용할 수 있습니다, 다만 항상 설정하기보다는 해당 쿼리를 사용하는 트랜잭션의 흐름에 따라 결정합니다.


말씀해주신 @Modifying을 사용하는 상황이 발생하면 영속성 컨텍스트에 있는 데이터와 차이가 발생하는 상황은 예를들어 아래와 같은 경우라고 이해했습니다.

예를 들어 같은 트랜잭션 안에서 아래 코드를 실행한다고 가정하겠습니다.

val coupon = couponRepository.findById(couponId)
// coupon.issuedQuantity는 10

couponRepository.incrementIssuedQuantity(couponId) // @Modifying
// DB의 issuedQuantity는 11
// 기존 coupon 객체의 issuedQuantity는 여전히 10

val foundAgainCoupon = couponRepository.findById(couponId)
// findById()를 다시 호출해도 영속성 컨텍스트에 있는 기존 객체를 반환하므로 여전히 10

위 상황은 재조회한 coupon 의 발급수량이 변경되지 않은 이전값으로 보여서 문제가 될 수 있습니다.


반면, 강의의 최종 발급 코드에서는 Coupon 엔티티를 미리 조회하지 않고, UPDATE 쿼리로 발급 수량을 증가시킵니다. 이후에도 해당 Coupon 객체를 사용하지 않아요. 따라서 해당 흐름에는 오래된 값을 가진 Coupon 객체가 영속성 컨텍스트에 없으므로, 말씀해주신 두 옵션 없이 사용해도 괜찮습니다.

옵션의 역할을 보면, flushAutomatically = true는 UPDATE 쿼리를 실행하기 전에, 코드에서 엔티티 값을 바꿨지만 아직 DB에는 저장되지 않은 내용부터 먼저 DB에 반영하는 옵션이고, clearAutomatically = true는 UPDATE 실행 후 영속성 컨텍스트 전체를 비우는 설정입니다.

실무에서는 트랜잭션 안에서 대상 엔티티를 미리 조회했는지와 UPDATE 이후 어떻게 사용하는지를 확인한 후 위 옵션을 사용할지 말지 결정하면 됩니다.

감사합니다.

Tasklet 배치 관련 내용

0

9

1

verify.sh 4단계 실패 — Jenkins 컨테이너에서 127.0.0.1:6443 connection refused

0

13

1

조회 메서드 네이밍 질문

0

20

0

소스파일

0

27

1

강의 판서 자료

0

24

2

모의고사 파일오류

0

54

3

Properties 설정이 추가되었는데

0

25

1

아무 수정도 안하고 주어진 소스로 그대로 했는데 패스워드 에러가 남

1

44

1

[환불 승인 요청] 강의 오결제 및 재구매 관련 문의드립니다.

0

32

1

처음 실행 시 계속 패스워드가 틀리다고 나옴. 수정하고 해도 마찬가지임

1

51

2

모의고사 다운

0

40

1

강의 DB데이터 질문

0

38

1

22강 [토큰 저장] 질문

0

41

1

업캐스팅 원칙

0

55

2

섹션 2 - 9강. API 관련 질문

0

54

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

60

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

50

2

Issuance 테이블에 status, couponId 인덱스가 꼭 필요할까요?

2

68

1

부하 테스트 시 설정 관련 질문드립니다

1

97

2

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

2

116

1

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

98

1

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

127

1

스크립트에 대해 질문 있습니다.

1

97

1

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

116

1