Service
home
WOW Onboarding
home
🖥️

[실전 백엔드 스터디 4주차 과제]

들어가기 앞서

강의 영상과 강의록

•
강의 영상
•
강의 자료
BE-Week4.pdf
38.5 MiB
안녕하세요 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 파일을 제출합니다. 더 자세한 사항은 아래 링크를 참조해주세요.