Skip to content

Latest commit

 

History

History
41 lines (29 loc) · 2.43 KB

File metadata and controls

41 lines (29 loc) · 2.43 KB

트랜잭션 경계 진화 기록

한정판매 주문/결제 흐름을, 하나의 큰 트랜잭션에서 시작해 커밋 단위로 외부 호출을 트랜잭션 밖으로 밀어내며 진화시킨 기록이다. 각 커밋은 하나의 판단만 담는다.

  • 빌드 스택: 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분.

Commit 0. 멀티모듈/인프라 스캐폴드

이 커밋의 목적

주문/결제 흐름을 올리기 전, 멀티모듈 + 하이브리드 영속성(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).