Skip to content

[Volume-7] 이벤트 기반 아키텍처 구현 - #322

Merged
kimsungho93 merged 168 commits into
loopers-labs:kimsungho93from
kimsungho93:volume-7
Jul 12, 2026
Merged

[Volume-7] 이벤트 기반 아키텍처 구현 #322
kimsungho93 merged 168 commits into
loopers-labs:kimsungho93from
kimsungho93:volume-7

Conversation

@kimsungho93

@kimsungho93 kimsungho93 commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

🧭 Context & Decision

문제 정의

  • 현재 동작/제약: 쿠폰 발급은 동기 API(POST /coupons/{id}/issue) 하나뿐이고, CouponTemplate에 수량 개념이 없어 "선착순 N명" 이벤트를 열 수 없다. 중복 발급 방지도 user_coupon 유니크 제약에만 의존한다.
  • 문제(리스크): 오픈 순간 트래픽이 몰리면 ① 수량 초과 발급(over-issue) ② 매진 이후의 무의미한 트래픽까지 전부 DB에 직격 — 두 가지가 동시에 터진다.
  • 성공 기준(완료 정의):
    • 동시 200요청 / 수량 100 → 정확히 100건 발급, 초과 0건 (테스트로 증명)
    • 매진·중복 사용자는 Kafka/DB에 도달하기 전에 즉시 거절
    • 발급 결과를 사용자가 polling으로 확인 가능 (REQUESTED → ISSUED/SOLD_OUT/ALREADY_ISSUED/FAILED)

선택지와 결정

flowchart LR
    U[사용자] --> G{"1차 · Redis Lua 게이트<br/>중복+재고 원자 판정"}
    G -- "중복/매진" --> X["409 즉시 거절<br/>(Kafka·DB 도달 안 함)"]
    G -- 통과 --> S["요청 저장 REQUESTED<br/>+ Kafka 발행 → 202"]
    S --> K[["2차 · coupon-issue-requests<br/>key=couponId (파티션 직렬화)"]]
    K --> D{"3차 · DB 조건부 UPDATE<br/>issued_count < total_quantity"}
    D -- 성공 --> I[✅ ISSUED]
    D -- "0 rows" --> O[⛔ SOLD_OUT]
Loading
방어선 역할 이 층이 뚫리면
1차 Redis Lua 게이트 중복 확인 + 재고 차감을 스크립트 하나로 원자 판정, 매진 트래픽을 API 앞에서 흡수 재시작으로 카운터 유실 가능 → 2·3차가 받친다
2차 Kafka 파티션 직렬화 같은 쿠폰 요청을 한 파티션에 모아 DB 행 경합 완화 (성능 장치일 뿐) 리밸런스·재배달 시 동시 실행 가능 → 3차가 받친다
3차 DB 조건부 UPDATE WHERE issued_count < total_quantity최종 진실 없음 (최후 방어선)
  • 고려한 대안:

    A. DB 가드 단독 B. Redis 분산락 ✅ C. Lua 게이트 + DB 가드
    초과 발급 방지
    매진 사용자 응답 폴링해야 알 수 있음 폴링해야 알 수 있음 즉시 409
    스파이크 시 Kafka·DB 부하 전량 통과 전량 통과 + 락 대기 게이트에서 흡수
    추가 장애 지점 없음 락 지연·해제 누락 Redis (fail-closed로 명시 거절)
    판단 기준선으로 먼저 구현 ❌ 파티션+조건부 UPDATE가 이미 직렬화·원자성을 보장해 락이 지킬 게 없음 ✅ 채택
  • 최종 결정: C — "Redis는 문지기, 진실은 DB". Redis가 원자적이어도 재시작 시 카운터가 유실될 수 있으므로 성능 게이트로만 쓰고, over-issue 차단의 책임은 DB 조건부 UPDATE가 진다. 구현 순서도 DB 가드(기준선) → 게이트 순으로 쌓아 어느 층이 빠져도 정합성이 깨지지 않게 했다.

  • 트레이드오프:

    • 💡 under-issue는 수용, over-issue만 절대 금지 — 게이트 통과 후 발행/처리 실패 시 Redis 카운터를 되돌리는 보상 로직을 두지 않았다 (보상 로직 자체가 새 장애 지점이 되는 것을 피함)
    • ⚠️ Redis 장애 시 fail-closed — 게이트가 죽으면 발급 요청도 막힌다 (예외를 삼키고 통과시키면 트래픽 차단 기능이 사라지는 순간이 하필 인프라 불안정 시점이라 의도적으로 선택)
  • 추후 개선 여지: API가 요청 저장 후 발행 직전에 죽으면 REQUESTED로 갇힌 행이 남는다(빈도 극저로 보고 수용) → 타임아웃 reaper로 보정 가능. DLT에 쌓인 실패 메시지 재처리 프로세스도 후속 과제.

🤔 고민한 점 / 막혔던 부분

  • 중복 발급 감지를 "INSERT 후 유니크 위반 catch"로 설계했다가 뒤집었다. JPA는 flush 중 제약 위반이 나면 트랜잭션이 rollback-only로 마킹되어, 같은 트랜잭션에서 ALREADY_ISSUED 상태 전이를 커밋할 수 없다(UnexpectedRollbackException). 그래서 선조회(findIssuedCoupon)로 분기하고, 유니크 제약은 선조회 직후 끼어드는 극히 드문 레이스의 안전망으로만 남겼다 — 이 경우 예외를 그대로 던져 롤백시키면 재전달 시 선조회가 기존 발급을 발견해 정상적으로 ALREADY_ISSUED로 정리된다.
  • DECR-on-missing-key 함정: Redis는 없는 키에 DECR하면 0에서 시작해 -1이 된다 — 첫 요청이 매진으로 오판될 수 있어, 스크립트 안에서 lazy-init(EXISTS 확인 후 초기화)으로 해결했다. 쿠폰 생성 시점에 미리 초기화하지 않은 건 쿠폰 생성이 Redis 가용성에 의존하게 되는 걸 피하기 위함이다.

🙋 기타

로컬 인프라(실 Kafka)로 전체 왕복을 실측 검증했다:

시나리오 결과
발급 요청 → 폴링 202 REQUESTED → 0.5초 만에 ISSUED
같은 사용자 재요청 409 (게이트 DUPLICATE)
수량 3 소진 후 4번째 사용자 409 — Kafka·DB에 도달하지 않고 게이트에서 차단
최종 집계 issued_count 3 / total_quantity 3, 초과 0건

Claude Code 로컬 skill 파일을 원격에 올리지 않도록 ignore.
Working Principles 5개 원칙 명시, Git Workflow (브랜치/커밋 컨벤션) 추가,
영역별 상세 룰은 외부 skill (/coding-style, /design, /refactor, /tdd) 로 분리.
수동 getter/protected 기본 생성자 제거 후 @Getter/@NoArgsConstructor/@builder 로 통일.
사용처(ProductService, 관련 테스트 3종)도 빌더 호출로 정렬.
POST /api/v1/users — 로그인 ID 중복/비밀번호 정책/이메일 형식 검증 후 BCrypt 인코딩하여 저장.
domain/application/interfaces 레이어와 단위/통합/E2E 테스트 포함.
X-Loopers-LoginId/Pw 헤더 기반 인증 — Spring Security 필터 체인에 커스텀
LoopersAuthenticationFilter 를 추가하고, 인증 실패는 LoopersAuthenticationEntryPoint 가
401 UNAUTHORIZED ApiResponse 로 변환.

UserRepository 에 단건 조회 메서드(findById, findByLoginId) 도 함께 추가.
findByLoginId 는 필터가 사용하고, findById 는 후속 내 정보 조회 API 에서 사용.
GET /api/v1/users/me — 인증된 사용자의 회원 정보를 반환. 이름은 Response DTO 변환
시점에 마지막 한 글자만 * 로 마스킹 (응답 필드: loginId/name/birthDate/email).

UserService.getById, UserFacade.getMyInfo, UserV1Dto.MyInfoResponse(마스킹), 컨트롤러
GET /me 핸들러까지 단위(마스킹)/통합(Service/Facade)/E2E(정상 + 인증 실패 3종)
테스트와 함께 추가.
- anyRequest() 를 denyAll 로 바꾸고 허용 경로(POST /api/v1/users, Swagger, /error) 만 명시적 permitAll
- /api/** 를 일괄 authenticated 로 묶어 인증 누락 방지
- PasswordEncoder 빈을 SecurityConfig 로 통합 (PasswordEncoderConfig 제거)
- 변경된 인증 정책에 맞춰 ExampleV1ApiE2ETest 에 헤더 인증 추가
- PUT /api/v1/users/me/password — 인증된 사용자 본인의 비밀번호 변경
- 현재 비밀번호 검증 실패 시 401, 정책 위반/동일 비밀번호 시 400
- 정책 검증은 기존 UserPasswordPolicy 재사용 (8~16자, 생년월일 미포함)
- 도메인/서비스/E2E 레이어 테스트 추가
- UserV1ApiSpec 인터페이스 신규: @tag, 엔드포인트별 @operation(summary/description), 인증 헤더 @parameter, @ApiResponses 응답 코드 매핑
- 각 에러 코드에 @content + @ExampleObject 로 실제 응답 바디(ApiResponse.fail) 예시 노출
- UserV1Controller 가 UserV1ApiSpec 을 implements, 각 메서드에 @OverRide 추가
- 각 record 필드에 @Schema(description/example/requiredMode) 부착
- record 선언부에 @Schema(name) 으로 OpenAPI 스키마 이름을 Java 내부 래퍼 클래스 구조와 분리 (UserV1Dto$SignUpRequest → SignUpRequest 등)
원본 com.querydsl 가 사실상 미관리 상태(마지막 릴리즈 2021)라 record 기반 @embeddable 등 Java 신기능 APT 처리가 막힘. io.github.openfeign.querydsl 6.10.1 (소스 호환, jakarta 네이티브) 로 교체하여 record VO 도입 기반을 마련.
LoginId/Email/EncodedPassword/PlainPassword/UserName/BirthDate 를 도메인 VO 로
분리해 invariant 를 한 군데로 모으고, JPA @embeddable 로 박아 UserModel 이 VO
타입을 그대로 보존하도록 한다.
비밀번호 정책 검증은 PlainPassword VO 의 record 생성자에서 처리하므로
별도 정책 클래스를 둘 필요가 없다.
application 측 SignUpCommand 는 controller 가 facade 로 넘기는 raw 입력,
도메인 측 SignUpUserCommand 는 VO 로 묶인 도메인 입력으로 layer 책임을 분리.
LoginId 파싱과 비밀번호 매칭 책임을 UserAuthenticator 로 빼고,
LoopersAuthenticationFilter 는 헤더 추출과 SecurityContext 설정만 담당한다.
primitive 필드 + 자체 validation 을 걷어내고 도메인 VO 를 @Embedded 로 박는다.
회원 가입 사건이 빌더 체인에 묻히지 않도록 UserModel.signUp 정적 팩토리를 노출.
JpaRepository.findByLoginId 시그니처도 LoginId 타입으로 맞춘다.
signUp 은 SignUpUserCommand 를 받아 EncodedPassword 까지 만든 뒤 UserModel.signUp
으로 위임하고, changePassword 는 현재 비번 매칭과 raw 동일 여부 검증을 직접
수행한 뒤 PlainPassword 로 정책만 검사. getUser 도 LoginId 가 아닌 PK 기반으로
표준화한다.
Facade 는 raw 입력을 VO 로 감싸 SignUpUserCommand 를 만들어 도메인에 넘기고,
UserInfo 는 UserModel 의 VO 를 unwrap 해 외부에 노출.
controller 는 UserInfo 를 받아 V1Dto.UserResponse/MyInfoResponse 로만 매핑하고,
SignUpRequest.toCommand 와 ChangePasswordRequest 시그니처를 facade 의 새 API 와
맞춰 ApiSpec 도 가독성 위주로 단순화.
@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 471 files, which is 321 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e9cdc68a-39e6-4ea4-b0aa-8ef409c96803

📥 Commits

Reviewing files that changed from the base of the PR and between 2cbddae and 37d0ae1.

📒 Files selected for processing (471)
  • .agents/skills/analyze-external-integration/SKILL.md
  • .agents/skills/analyze-query/SKILL.md
  • .agents/skills/coding-style/SKILL.md
  • .agents/skills/design/SKILL.md
  • .agents/skills/refactor/SKILL.md
  • .agents/skills/tdd/SKILL.md
  • .gitignore
  • AGENTS.md
  • CLAUDE.md
  • apps/commerce-api/build.gradle.kts
  • apps/commerce-api/src/main/java/com/loopers/CommerceApiApplication.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/ProductFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/ProductInfo.java
  • apps/commerce-api/src/main/java/com/loopers/brand/application/BrandAdminFacade.java
  • apps/commerce-api/src/main/java/com/loopers/brand/application/BrandFacade.java
  • apps/commerce-api/src/main/java/com/loopers/brand/application/BrandInfo.java
  • apps/commerce-api/src/main/java/com/loopers/brand/application/CreateBrandCommand.java
  • apps/commerce-api/src/main/java/com/loopers/brand/application/UpdateBrandCommand.java
  • apps/commerce-api/src/main/java/com/loopers/brand/domain/Brand.java
  • apps/commerce-api/src/main/java/com/loopers/brand/domain/BrandRepository.java
  • apps/commerce-api/src/main/java/com/loopers/brand/domain/BrandService.java
  • apps/commerce-api/src/main/java/com/loopers/brand/domain/vo/BrandName.java
  • apps/commerce-api/src/main/java/com/loopers/brand/infrastructure/BrandJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/brand/infrastructure/BrandRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/brand/interfaces/api/BrandAdminV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/brand/interfaces/api/BrandAdminV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/brand/interfaces/api/BrandV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/brand/interfaces/api/BrandV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventEnvelope.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventMessage.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventOutboxRelay.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventOutboxRelayItem.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventOutboxRelayProperties.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventOutboxRelayRepository.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventOutboxWriter.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventPayload.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/CatalogEventType.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/listener/ProductLikeCatalogEventOutboxListener.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/application/listener/ProductViewCatalogEventOutboxListener.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventOutbox.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventOutboxJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventOutboxRelayRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventOutboxRelayScheduler.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventOutboxStatus.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventOutboxWriterImpl.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/CatalogEventTopicConfig.java
  • apps/commerce-api/src/main/java/com/loopers/catalog/infrastructure/KafkaCatalogEventPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/config/security/AdminAuthenticationFilter.java
  • apps/commerce-api/src/main/java/com/loopers/config/security/LoopersAuthenticationEntryPoint.java
  • apps/commerce-api/src/main/java/com/loopers/config/security/LoopersAuthenticationFilter.java
  • apps/commerce-api/src/main/java/com/loopers/config/security/SecurityConfig.java
  • apps/commerce-api/src/main/java/com/loopers/config/security/UserAuthenticator.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponAdminFacade.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponFacade.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponInfo.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueGate.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueGateResult.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueInfo.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueProperties.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueRequestInfo.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueRequestMessage.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CouponIssueRequestPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/CreateCouponCommand.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/IssueCouponCommand.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/IssuedCouponInfo.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/UpdateCouponCommand.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/UserCouponDisplayStatus.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/UserCouponInfo.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/application/UserCouponListQuery.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponIssueRequest.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponIssueRequestRepository.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponIssueRequestService.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponIssueRequestStatus.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponIssueResult.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponIssueStatus.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponService.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponTemplate.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponTemplateRepository.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponType.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/CouponUse.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/UserCoupon.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/UserCouponRepository.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/UserCouponStatus.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/policy/CouponDiscountMethod.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/policy/CouponDiscountPolicy.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/policy/FixedCouponDiscountPolicy.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/policy/RateCouponDiscountPolicy.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponDiscount.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponExpiration.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponMoney.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponName.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponOwner.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponQuantity.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/CouponTemplateId.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/DiscountRate.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/domain/vo/DiscountValue.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/CouponIssueRequestJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/CouponIssueRequestRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/CouponIssueRequestTopicConfig.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/CouponTemplateJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/CouponTemplateRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/KafkaCouponIssueRequestPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/RedisCouponIssueGate.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/UserCouponJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/UserCouponListQueryDsl.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/infrastructure/UserCouponRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/interfaces/api/CouponAdminV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/interfaces/api/CouponAdminV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/interfaces/api/CouponV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/interfaces/api/CouponV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/interfaces/api/UserCouponV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/coupon/interfaces/consumer/CouponIssueRequestConsumer.java
  • apps/commerce-api/src/main/java/com/loopers/domain/example/ExampleRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductModel.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductService.java
  • apps/commerce-api/src/main/java/com/loopers/example/application/ExampleFacade.java
  • apps/commerce-api/src/main/java/com/loopers/example/application/ExampleInfo.java
  • apps/commerce-api/src/main/java/com/loopers/example/domain/Example.java
  • apps/commerce-api/src/main/java/com/loopers/example/domain/ExampleRepository.java
  • apps/commerce-api/src/main/java/com/loopers/example/domain/ExampleService.java
  • apps/commerce-api/src/main/java/com/loopers/example/infrastructure/ExampleJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/example/infrastructure/ExampleRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/example/interfaces/api/ExampleV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/example/interfaces/api/ExampleV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/example/interfaces/api/ExampleV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/product/ProductV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/product/ProductV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/GetMyLikesCommand.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/LikeCommandService.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/LikeFacade.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/ProductLikeCountChangeRecorder.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/event/ProductLikeEventPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/event/ProductLikedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/event/ProductUnlikedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/listener/LikeActivityLogListener.java
  • apps/commerce-api/src/main/java/com/loopers/like/application/listener/ProductLikeCountChangeListener.java
  • apps/commerce-api/src/main/java/com/loopers/like/domain/Like.java
  • apps/commerce-api/src/main/java/com/loopers/like/domain/LikeChange.java
  • apps/commerce-api/src/main/java/com/loopers/like/domain/LikeRepository.java
  • apps/commerce-api/src/main/java/com/loopers/like/domain/LikeService.java
  • apps/commerce-api/src/main/java/com/loopers/like/domain/ProductLikeCountChange.java
  • apps/commerce-api/src/main/java/com/loopers/like/domain/ProductLikeCountChangeRepository.java
  • apps/commerce-api/src/main/java/com/loopers/like/infrastructure/LikeJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/like/infrastructure/LikeRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/like/infrastructure/ProductLikeCountChangeJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/like/infrastructure/ProductLikeCountChangeRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/like/interfaces/api/LikeV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/like/interfaces/api/UserLikeV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/CreateOrderCommand.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/GetMyOrdersCommand.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/OrderAdminFacade.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/OrderFacade.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/OrderInfo.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/OrderItemFactory.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/event/OrderCreatedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/event/OrderEventPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/order/application/listener/OrderActivityLogListener.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/Order.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/OrderItem.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/OrderItems.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/OrderRepository.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/OrderSearchPeriod.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/OrderService.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/OrderStatus.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/vo/OrderAmountSnapshot.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/vo/OrderItemSnapshot.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/vo/OrderPrice.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/vo/OrderQuantity.java
  • apps/commerce-api/src/main/java/com/loopers/order/domain/vo/Orderer.java
  • apps/commerce-api/src/main/java/com/loopers/order/infrastructure/OrderJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/order/infrastructure/OrderRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/order/interfaces/api/OrderAdminV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/order/interfaces/api/OrderAdminV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/order/interfaces/api/OrderV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/order/interfaces/api/OrderV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PaymentCallbackCommand.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PaymentFacade.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PaymentInfo.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PaymentRecoveryFacade.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PaymentRecoveryProperties.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PaymentRecoveryResultHandler.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/PgPaymentFailureReason.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/RequestPaymentCommand.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/event/OrderPaidEvent.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/event/OrderPaymentEventPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/event/OrderPaymentFailedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/listener/PaymentActivityLogListener.java
  • apps/commerce-api/src/main/java/com/loopers/payment/application/listener/PaymentNotificationListener.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/CardType.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/Payment.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentCard.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentFailureReason.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGateway.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayOrderTransactions.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayPaymentCommand.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayQueryResult.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayQueryStatus.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayRequestStatus.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayResult.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayTransaction.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentGatewayTransactionDetail.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentRepository.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentService.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PaymentStatus.java
  • apps/commerce-api/src/main/java/com/loopers/payment/domain/PgPaymentStatus.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PaymentJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PaymentRecoveryScheduler.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PaymentRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorApiResponse.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorMetadata.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorOrderPaymentResponse.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorPaymentDetailResponse.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorPaymentGateway.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorPaymentRequest.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorPaymentResponse.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorProperties.java
  • apps/commerce-api/src/main/java/com/loopers/payment/infrastructure/PgSimulatorResult.java
  • apps/commerce-api/src/main/java/com/loopers/payment/interfaces/api/PaymentV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/payment/interfaces/api/PaymentV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/CreateProductCommand.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductAdminFacade.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductDetailInfo.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductDetailQuery.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductDetailViewInvalidator.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductFacade.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductInfo.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductLikeSummaryChange.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductLikeSummarySyncChunkProcessor.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductLikeSummarySyncProperties.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductLikeSummarySyncRepository.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductLikeSummarySynchronizer.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductLikeSummaryWriter.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductListInfo.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/ProductListQuery.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/UpdateProductCommand.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/event/ProductEventPublisher.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/event/ProductViewedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/product/application/listener/ProductActivityLogListener.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/Product.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/ProductRepository.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/ProductService.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/ProductSort.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/vo/ProductDescription.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/vo/ProductName.java
  • apps/commerce-api/src/main/java/com/loopers/product/domain/vo/ProductPrice.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/CachedProductDetailQuery.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/CachedProductListQuery.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductDetailCacheProperties.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductDetailQueryDsl.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductLikeSummary.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductLikeSummaryCheckpoint.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductLikeSummaryScheduler.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductLikeSummarySyncRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductLikeSummaryWriterImpl.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductListCacheProperties.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductListQueryDsl.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductListSort.java
  • apps/commerce-api/src/main/java/com/loopers/product/infrastructure/ProductRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/product/interfaces/api/ProductAdminV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/product/interfaces/api/ProductAdminV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/product/interfaces/api/ProductV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/product/interfaces/api/ProductV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/shared/error/CoreException.java
  • apps/commerce-api/src/main/java/com/loopers/shared/error/ErrorType.java
  • apps/commerce-api/src/main/java/com/loopers/shared/pagination/PageQuery.java
  • apps/commerce-api/src/main/java/com/loopers/shared/pagination/PageResult.java
  • apps/commerce-api/src/main/java/com/loopers/shared/presentation/ApiControllerAdvice.java
  • apps/commerce-api/src/main/java/com/loopers/shared/presentation/ApiResponse.java
  • apps/commerce-api/src/main/java/com/loopers/shared/presentation/PageResponse.java
  • apps/commerce-api/src/main/java/com/loopers/stock/domain/ProductStock.java
  • apps/commerce-api/src/main/java/com/loopers/stock/domain/ProductStockRepository.java
  • apps/commerce-api/src/main/java/com/loopers/stock/domain/ProductStockService.java
  • apps/commerce-api/src/main/java/com/loopers/stock/domain/StockDeductItem.java
  • apps/commerce-api/src/main/java/com/loopers/stock/domain/vo/StockQuantity.java
  • apps/commerce-api/src/main/java/com/loopers/stock/infrastructure/ProductStockJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/stock/infrastructure/ProductStockRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/user/application/SignUpRequestCommand.java
  • apps/commerce-api/src/main/java/com/loopers/user/application/UserFacade.java
  • apps/commerce-api/src/main/java/com/loopers/user/application/UserInfo.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/PasswordHasher.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/User.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/UserRepository.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/UserService.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/command/SignUpUserCommand.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/vo/BirthDate.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/vo/Email.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/vo/EncodedPassword.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/vo/LoginId.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/vo/PlainPassword.java
  • apps/commerce-api/src/main/java/com/loopers/user/domain/vo/UserName.java
  • apps/commerce-api/src/main/java/com/loopers/user/infrastructure/BCryptPasswordHasher.java
  • apps/commerce-api/src/main/java/com/loopers/user/infrastructure/UserJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/user/infrastructure/UserRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/user/interfaces/api/UserV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/user/interfaces/api/UserV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/user/interfaces/api/UserV1Dto.java
  • apps/commerce-api/src/main/resources/application.yml
  • apps/commerce-api/src/test/java/com/loopers/brand/application/BrandAdminFacadeIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/brand/domain/BrandServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/brand/domain/BrandServiceTest.java
  • apps/commerce-api/src/test/java/com/loopers/brand/domain/BrandTest.java
  • apps/commerce-api/src/test/java/com/loopers/brand/domain/vo/BrandNameTest.java
  • apps/commerce-api/src/test/java/com/loopers/brand/interfaces/api/BrandAdminV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/brand/interfaces/api/BrandV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/application/CatalogEventEnvelopeTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/application/CatalogEventOutboxRelayPropertiesTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/application/CatalogEventOutboxRelayTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/application/listener/ProductLikeCatalogEventOutboxListenerTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/application/listener/ProductViewCatalogEventOutboxListenerTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/infrastructure/CatalogEventOutboxRelayRepositoryImplTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/infrastructure/CatalogEventOutboxTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/infrastructure/CatalogEventOutboxWriterImplTest.java
  • apps/commerce-api/src/test/java/com/loopers/catalog/infrastructure/KafkaCatalogEventPublisherTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/application/CouponFacadeIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/application/UserCouponDisplayStatusTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/CouponIssueRequestServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/CouponIssueRequestTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/CouponServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/CouponTemplateTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/UserCouponTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/policy/CouponDiscountMethodTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/CouponExpirationTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/CouponMoneyTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/CouponOwnerTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/CouponQuantityTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/CouponTemplateIdTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/DiscountRateTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/domain/vo/DiscountValueTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/infrastructure/CouponTemplateRepositoryIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/infrastructure/RedisCouponIssueGateIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/interfaces/api/CouponAdminV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/interfaces/api/CouponIssueRequestV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/interfaces/api/CouponV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/coupon/interfaces/consumer/CouponIssueRequestConsumerTest.java
  • apps/commerce-api/src/test/java/com/loopers/example/domain/ExampleServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/example/domain/ExampleTest.java
  • apps/commerce-api/src/test/java/com/loopers/example/interfaces/api/ExampleV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/like/application/LikeAggregationEventIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/application/LikeFacadeIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/application/event/ProductLikeEventPublisherTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/application/listener/LikeActivityLogListenerTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/application/listener/ProductLikeCountChangeListenerTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/domain/LikeChangeTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/domain/LikeServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/domain/LikeTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/domain/ProductLikeCountChangeTest.java
  • apps/commerce-api/src/test/java/com/loopers/like/interfaces/api/LikeV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/order/application/OrderFacadeIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/application/OrderFacadeTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/application/event/OrderEventPublisherTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/application/listener/OrderActivityLogListenerTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/OrderItemTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/OrderItemsTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/OrderServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/OrderTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/vo/OrderItemSnapshotTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/vo/OrderPriceTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/domain/vo/OrderQuantityTest.java
  • apps/commerce-api/src/test/java/com/loopers/order/interfaces/api/OrderAdminV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/order/interfaces/api/OrderV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/application/PaymentFacadeTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/application/PaymentRecoveryFacadeTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/application/PaymentRecoveryResultHandlerTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/application/event/OrderPaymentEventPublisherTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/domain/PaymentCardTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/domain/PaymentGatewayResultTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/domain/PaymentServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/domain/PaymentTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/infrastructure/PgSimulatorPaymentGatewayTest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/interfaces/api/PaymentV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/payment/interfaces/api/PaymentV1DtoTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/application/ProductFacadeTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/application/ProductLikeSummarySynchronizerIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/application/ProductReadTransactionBoundaryTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/application/event/ProductEventPublisherTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/application/listener/ProductActivityLogListenerTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/domain/ProductServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/domain/ProductTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/domain/vo/ProductDescriptionTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/domain/vo/ProductNameTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/domain/vo/ProductPriceTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/infrastructure/ProductListCachePropertiesTest.java
  • apps/commerce-api/src/test/java/com/loopers/product/interfaces/api/ProductAdminV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/product/interfaces/api/ProductV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/shared/error/CoreExceptionTest.java
  • apps/commerce-api/src/test/java/com/loopers/shared/pagination/PageQueryTest.java
  • apps/commerce-api/src/test/java/com/loopers/stock/domain/ProductStockServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/stock/domain/ProductStockTest.java
  • apps/commerce-api/src/test/java/com/loopers/stock/domain/vo/StockQuantityTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/application/UserFacadeIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/UserServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/UserTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/vo/BirthDateTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/vo/EmailTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/vo/EncodedPasswordTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/vo/LoginIdTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/vo/PlainPasswordTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/domain/vo/UserNameTest.java
  • apps/commerce-api/src/test/java/com/loopers/user/interfaces/api/UserV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/user/interfaces/api/UserV1DtoTest.java
  • apps/commerce-batch/build.gradle.kts
  • apps/commerce-streamer/build.gradle.kts
  • apps/commerce-streamer/src/main/java/com/loopers/interfaces/consumer/DemoKafkaConsumer.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/CatalogEventEnvelope.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/CatalogEventPayload.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/CatalogEventType.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/EventHandledRepository.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/EventHandlingMetadata.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/ProductMetricDelta.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/ProductMetricEventHandler.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/application/ProductMetricsRepository.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/infrastructure/CatalogMetricsTopicConfig.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/infrastructure/EventHandled.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/infrastructure/JdbcEventHandledRepository.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/infrastructure/JdbcProductMetricsRepository.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/infrastructure/ProductMetrics.java
  • apps/commerce-streamer/src/main/java/com/loopers/metrics/interfaces/consumer/CatalogMetricsConsumer.java
  • apps/commerce-streamer/src/main/resources/application.yml
  • apps/commerce-streamer/src/test/java/com/loopers/metrics/application/ProductMetricEventHandlerTest.java
  • apps/commerce-streamer/src/test/java/com/loopers/metrics/infrastructure/MetricsJdbcRepositoryIntegrationTest.java
  • apps/commerce-streamer/src/test/java/com/loopers/metrics/interfaces/consumer/CatalogMetricsConsumerTest.java
  • apps/commerce-streamer/src/test/java/com/loopers/metrics/interfaces/consumer/CatalogMetricsKafkaE2ETest.java
  • apps/pg-simulator/README.md
  • apps/pg-simulator/build.gradle.kts
  • apps/pg-simulator/src/main/kotlin/com/loopers/PaymentGatewayApplication.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/application/payment/OrderInfo.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/application/payment/PaymentApplicationService.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/application/payment/PaymentCommand.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/application/payment/TransactionInfo.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/config/web/WebMvcConfig.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/CardType.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/Payment.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/PaymentEvent.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/PaymentEventPublisher.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/PaymentRelay.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/PaymentRepository.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/TransactionKeyGenerator.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/payment/TransactionStatus.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/domain/user/UserInfo.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/infrastructure/payment/PaymentCoreEventPublisher.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/infrastructure/payment/PaymentCoreRelay.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/infrastructure/payment/PaymentCoreRepository.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/infrastructure/payment/PaymentJpaRepository.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/interfaces/api/ApiControllerAdvice.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/interfaces/api/ApiResponse.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/interfaces/api/argumentresolver/UserInfoArgumentResolver.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/interfaces/api/payment/PaymentApi.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/interfaces/api/payment/PaymentDto.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/interfaces/event/payment/PaymentEventListener.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/support/error/CoreException.kt
  • apps/pg-simulator/src/main/kotlin/com/loopers/support/error/ErrorType.kt
  • apps/pg-simulator/src/main/resources/application.yml
  • build.gradle.kts
  • docs/week2/01-requirements.md
  • docs/week2/02-sequence-diagrams.md
  • docs/week2/03-class-diagram.md
  • docs/week2/04-erd.md
  • gradle.properties
  • http/http-client.env.json
  • http/pg-simulator/payments.http
  • modules/jpa/build.gradle.kts
  • modules/jpa/src/main/java/com/loopers/config/jpa/JpaConfig.java
  • modules/kafka/src/main/java/com/loopers/confg/kafka/KafkaConfig.java
  • modules/kafka/src/main/resources/kafka.yml
  • modules/redis/src/testFixtures/java/com/loopers/testcontainers/RedisTestContainersConfig.java
  • settings.gradle.kts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@kimsungho93
kimsungho93 merged commit 37d0ae1 into loopers-labs:kimsungho93 Jul 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants