한정판매 주문/결제 흐름을, 하나의 큰 트랜잭션에서 시작해 커밋 단위로 외부 호출을 트랜잭션 밖으로 밀어내며 진화시킨 기록이다. 각 커밋은 하나의 판단만 담는다.
- 빌드 스택: Spring Boot 4.1.0 / Kotlin 2.3.21 / Java 25 / Gradle 9.5.1
- 영속성: JPA(쓰기) + jOOQ(조회·조건부 update) 하이브리드. jOOQ codegen 은 Flyway SQL 을 단일 스키마 소스로 삼아 DB 없이 생성(POJO OFF).
- DB: MySQL 8.0 (로컬 docker-compose, 테스트 Testcontainers)
- MSA 가정: PG·WMS 는 별도 인스턴스 없이 in-process mock. connection timeout 은 결제 포함 최대 1분.
주문/결제 흐름을 올리기 전, 멀티모듈 + 하이브리드 영속성(JPA 쓰기 / jOOQ 조회) + Flyway(스키마 단일 소스) + jOOQ codegen + MySQL(Testcontainers) 파이프라인이 끝까지 동작하는 토대를 만든다.
단일 모듈 Spring Initializr 골격뿐. 트랜잭션 경계를 실험할 도메인도, jOOQ 도, 모듈 분리도 없다.
- 단일 모듈 → 멀티모듈(
apps:order-api,modules:jpa).apps/*만 BootJar. modules:jpa:BaseEntity, Flyway, jOOQ codegen(DDLDatabase, POJO OFF),spring-boot-starter-data-jpa+spring-boot-starter-jooq공유.example수직 슬라이스로 하이브리드 증명:ExampleRepositoryImpl이 쓰기는JpaRepository, 조회는DSLContext.- 공통
ApiResponse/CoreException/ErrorType/ApiControllerAdvice. docker/compose.yml(mysql:8.0), Testcontainers 통합테스트.
아직 단일 도메인 CRUD 수준. ExampleService.create 에만 @Transactional. 외부 호출 없음.
- jOOQ codegen 이 최신 스택(Boot 4.1 / Java 25 / Gradle 9.5)에서 동작함을 확인.
- 스키마 단일 소스(Flyway) ↔ JPA
validate↔ jOOQ 생성 코드의 정합성 확보.
- 두 앱이 같은 DB 를 공유하게 될 예정(워커 추가 시). Flyway 실행 주체를 order-api 로 한정해야 한다.
- 주문/결제/재고/출고 도메인 전부. 외부 호출(PG/WMS), Redis 선점, 워커.
- Commit 1: 가장 단순한 주문/결제 흐름(의도적으로 하나의
@Transactional).