하나의 큰 @Transactional 흐름에서 시작해, 커밋 단위로 외부 호출(PG/WMS)을 DB 트랜잭션 밖으로 밀어내고 실패·timeout·중복·재시도를 상태와 조건부 update 로 방어하는 과정을 학습용으로 남긴 POC.
- Spring Boot 4.1.0 / Kotlin 2.3.21 / Java 25 / Gradle 9.5.1
- 영속성: JPA(쓰기) + jOOQ(조회·조건부 update) 하이브리드
- DB: MySQL 8.0 (로컬 docker-compose, 테스트 Testcontainers)
- 스키마 단일 소스: Flyway. jOOQ 는 그 SQL 을 DDL 로 파싱해 코드 생성(DB 불필요, POJO OFF)
- MSA 가정: PG·WMS 는 in-process mock
apps/order-api 주문/결제 API (이후 Redis 선점·PG·확정 tx)
apps/shipment-worker 출고 워커 (Commit 5에서 추가)
modules/jpa DataSource·Flyway·jOOQ codegen·BaseEntity (공유)
modules/redis Redis 재고 선점 (Commit 3에서 추가)
docker compose -f docker/compose.yml up -d
./gradlew :apps:order-api:bootRun./gradlew build # jOOQ codegen 포함 전체 빌드
./gradlew :apps:order-api:test- 커밋별 트랜잭션 경계 변화: docs/transaction-evolution.md