들어가기 앞서
강의 영상과 강의록
•
강의 영상
•
강의 자료
안녕하세요 4주차 멘토 김지현입니다. 
모두 중간고사는 잘 보셨나요? 

이번 주차에는 영속성 컨텍스트와 트랜잭션의 동작을 간단히 복습하고, 동시 요청에서 발생할 수 있는 문제와 이를 해결하는 방법에 대해 다루었습니다.
직접 주문과 재고 차감 로직을 실행해보며 같은 상품에 여러 주문이 동시에 들어왔을 때 발생하는 갱신 손실을 재현해봅니다. 이후 낙관적 락과 비관적 락을 각각 적용하면서 동시성 문제를 어떻게 제어할 수 있는지 비교해보았습니다.
강의나 과제에 대해 궁금하거나 막히는 부분이 있다면 언제든지 디스코드 #정규스터디-질문방으로 연락 주세요!
이번 주차 진행 전 확인해주세요!
이번 주차 실습에 필요한 테스트 코드는 week4 브랜치에 미리 작성되어 있습니다. 테스트 코드를 직접 구현하기보다는 제공된 테스트를 실행하면서 결과가 어떻게 달라지는지 확인하는 방식으로 진행됩니다.
실습 중에는 지난 1~3주차와 동일하게 W4-0~W4-4로 표시된 TODO를 직접 구현하게 됩니다. 강의를 따라 TODO를 작성한 뒤 테스트 결과를 함께 확인해주세요!
실습 환경 안내이번 주차 실습을 원활하게 진행할 수 있도록 week4 브랜치에 필요한 설정을 미리 반영해두었습니다.
•
FakeProductRepository: 잠금 조회 메서드 추가에 따른 변경 사항을 미리 반영해두었습니다. 해당 부분은 별도로 수정하지 않아도 됩니다.
•
SQL 로그: 실습 중 실행되는 SQL을 확인할 수 있도록 로그 출력 설정을 미리 적용해두었습니다.
두 설정 모두 별도의 사전 작업 없이 실습을 진행하시면 됩니다.
4주차 실습 TODO 위치 안내
단계 | 구현 위치 | 할 일 |
W4-0 | OrderService.place() | 주문 수량만큼 재고 차감 |
W4-1 | Product | @Version 버전 필드 추가 |
W4-2 | ProductJpaRepository | 비관적 쓰기 잠금 조회 작성 |
W4-3 | ProductRepositoryAdapter | JPA Repository의 잠금 조회로 위임 |
W4-4 | OrderService.place() | 기존 상품 조회를 잠금 조회로 변경 |
과제
목표
•
동시 주문 상황에서 발생하는 문제 확인
•
낙관적 락과 비관적 락의 동시성 제어 방식 이해
•
테스트를 통해 동시성 제어의 결과 확인
동시 주문 결과 확인
수업에서 제공한 ConcurrentOrderTest의 조건을 다음과 같이 변경해주세요.
초기 재고: 5개
동시 주문: 10건
주문 수량: 각 1개
Plain Text
복사
낙관적 락이 적용된 상태에서 테스트를 여러 번 실행한 뒤, 실행 결과를 확인해주세요.
→ @Version을 유지하고, OrderService.place()가 비관적 잠금 조회가 아닌 일반 상품 조회를 사용하도록 변경한 뒤 테스트해주세요.
실행 결과는 테스트 결과 또는 콘솔 화면(SQL 결과, 커스텀 로그 등 결과를 확인 가능한 자료 등)을 캡처하여 제출해주세요.
WIL 작성
4주차 강의 및 실습 내용을 week4/wil.md에 정리해주세요.
아래 질문에 대한 답변을 포함해주세요.
1.
테스트를 여러 번 실행하고 성공·실패 건수와 최종 재고를 비교해보세요.
결과에 차이가 있다면 그 이유는 무엇일까요?
2.
실패한 주문의 원인을 확인해보세요. 낙관적 락 충돌과 재고 부족은 어떻게 다른가요?
추가로 아래 내용에 대해 알아보고, 해당 내용을 정리해주세요!
낙관적 락에서는 동시 주문 중 일부가 충돌로 실패할 수 있습니다. 강의에서 언급했듯, 실패한 주문을 다시 처리하려면 재시도 로직이 필요합니다.
그렇다면 실제 서비스에서 충돌한 주문을 재시도하고 싶다면 어떻게 해야 할까요?
그렇다면 실제 서비스에서 충돌한 주문을 재시도하고 싶다면 어떻게 해야 할까요?1.
충돌한 요청을 어떻게 다시 시도하도록 만들 수 있을까요?
2.
재시도한다면 몇 번까지 시도해야 할까요?
3.
낙관적 락 대신 비관적 락을 사용한다면 어떤 차이가 있을까요?
정해진 하나의 방식이 항상 정답인 것은 아닙니다. 충돌이 얼마나 자주 발생하는지, 요청의 실패를 허용할 수 있는지, 요청을 기다리게 해도 되는지 등을 고려하여 적절한 방식을 선택할 수 있습니다.
제출해야 할 파일과 파일 경로
•
하단 경로는 필수 디렉토리 & 파일을 기입한 것입니다. 실습에 따라 다른 디렉토리가 추가되어도 괜찮습니다.
[여러분들의 저장소 이름]
├── readme.md
├── .gitignore
├── commerce // 실습 코드
└── week4/
├── wil.md // 필수
└── concurrency_test.img // 필수
YAML
복사
wil.md는 반드시 전체 300자 이상 작성해주세요! 300자 미만일 시 과제 제출이 불가합니다.
•
wil.md: 위 질문에 대한 답변 및 4주차 강의 내용 정리
•
concurrency_test.img: 동시 주문 테스트 실행 결과 이지
선택 확장 과제 — 충돌을 HTTP 409로 전달하기
낙관적 락 충돌이 발생했을 때 GlobalExceptionHandler를 이용하여
HTTP 409 Conflict로 응답하도록 구현해보세요.
정답 코드는 week4-done 브랜치에 함께 제공되어있습니다!
마감 기한
와우스터디에서 확인해주세요.
제출 방법
자신의 레포지토리에 week4 폴더를 생성해 wil.md 파일을 제출합니다.
더 자세한 사항은 아래 링크를 참조해주세요.





