Skip to content

[volume-8] Redis 기반 주문 대기열 구현 - #349

Merged
kimsungho93 merged 182 commits into
loopers-labs:kimsungho93from
kimsungho93:volume-8
Jul 12, 2026
Merged

kimsungho93 merged 182 commits into
loopers-labs:kimsungho93from
kimsungho93:volume-8

Conversation

@kimsungho93

Copy link
Copy Markdown
Contributor

🧭 Context & Decision

문제 정의

  • 주문 API의 처리량은 한정돼 있는데, 행사 땐 그 이상이 한꺼번에 몰립니다.
  • 그냥 거절하면 유저는 순번도 모른 채 새로고침을 반복하고, 그 재시도가 트래픽을 더 키웁니다.
  • 게다가 주문·조회·결제가 한 앱에 있어, 주문이 몰려 터지면 다른 기능까지 함께 멈춥니다.
  • 그래서 유입을 감당 가능한 속도로 조절하면서, 대기 순번은 보여주고, 대기열이 죽어도 주문은 살아있게 하는 걸 목표로 잡았습니다.

선택지와 결정

Rate limiter로 초과분을 거절하는 방식은 순번을 줄 수 없고 서버가 느려져도 계속 밀어넣어서, 줄을 세우는 대기열 방식을 선택했습니다.

flowchart LR
    U[유저] -->|① 줄서기| Q[대기열<br/>Redis Sorted Set]
    Q -->|② 스케줄러가 순차 입장| T[입장 토큰]
    U -->|③ 토큰으로 주문| B[벌크헤드<br/>동시 실행 제한] --> G[게이트<br/>토큰 확인] --> O[주문 API]
Loading

설계하며 고민한 포인트

수치는 대부분 감으로 잡았다가 측정으로 다시 정했습니다. 핵심 고민은 아래와 같습니다.

flowchart LR
    R([대기열 설계 고민])
    R --> A[입장 속도]
    R --> B[동시 주문 상한]
    R --> C[토큰 쏠림 herd]
    R --> D[Redis 장애]
    R --> E[순번 조회 부하]
    A --> A1[공식 → 실측으로 재산정<br/>병목이 DB 아닌 인증]
    B --> B1[어림값이 과해 재보고 낮춤]
    C --> C1[발급 속도가 도착 속도 상한<br/>구조적 예방, 완화 미도입]
    D --> D1[거절과 판정불가 구분<br/>fail-open 후 재시도 안내]
    E --> E1[순번 비례 폴링<br/>대기 토큰으로 경량 식별]
    classDef cat fill:#EEEDFE,stroke:#534AB7,color:#26215C
    classDef leaf fill:#E1F5EE,stroke:#0F6E56,color:#04342C
    classDef root fill:#F1EFE8,stroke:#5F5E5A,color:#2C2C2A
    class R root
    class A,B,C,D,E cat
    class A1,B1,C1,D1,E1 leaf
Loading
고민한 지점 어떻게 풀었나 트레이드오프
스케줄러 입장 인원 실측 포화점 기준으로 산정 실측 환경(로컬)에 의존
동시 주문 상한 처리량 스윕으로 최적점 확인 사용자별이 아닌 전역 제한
Redis 장애 대응 fail-open, 대신 벌크헤드가 유량을 방어 장애 순간 순서 보장이 약해짐
순번 조회 방식 폴링 + 대기 토큰 식별 실시간(SSE) 아님

🤔 고민한 점 / 막혔던 부분

  • 간헐적으로만 터지는 경합: 줄서기에서 순번을 넣는 명령과 읽는 명령 사이에 스케줄러가 끼어들면, 방금 줄 선 유저의 순번이 비어버리는 문제가 있었습니다. 대기열이 한산할 때만 드물게 재현돼서 원인을 찾기 까다로웠는데, 통합 테스트로 잡아 두 명령을 Lua 스크립트 하나로 묶어 해결했습니다.
  • 테스트끼리 간섭: 스케줄러가 백그라운드로 계속 도는 탓에, 다른 테스트가 넣어둔 대기열 항목을 꺼내가 엉뚱한 테스트가 깨지는 일이 있었습니다. 스케줄러 테스트의 컨텍스트를 격리해서 해결했습니다.
  • 측정 환경 제약: 보안 설정이 지표 엔드포인트까지 막아둬서 내부 수치를 직접 못 읽었고, 부하를 준 상태와 안 준 상태의 차이로 처리 시간을 우회 측정했습니다.
  • 아직 남은 것: 대기하다 이탈한 유저의 토큰을 정리하는 작업은 이번엔 넣지 않았습니다. 뒷사람 순번에는 영향이 없어 급하진 않지만, 다음에 보완하려 합니다.

🙋 기타

주문 이후 이벤트 흐름은 R7 구조를 그대로 재사용했고, 대기열은 주문 앞단 관문만 새로 얹었습니다.

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 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 503 files, which is 353 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: dcc7c882-964b-4664-8b6d-751bcd9ba62d

📥 Commits

Reviewing files that changed from the base of the PR and between 2cbddae and 028302c.

📒 Files selected for processing (503)
  • .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/queue/application/QueueAdmitter.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/QueueEnterInfo.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/QueueEnterResult.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/QueueFacade.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/QueueMetrics.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/QueuePositionInfo.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/QueueProperties.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/TokenConsumeResult.java
  • apps/commerce-api/src/main/java/com/loopers/queue/application/WaitingQueue.java
  • apps/commerce-api/src/main/java/com/loopers/queue/domain/QueueEntryStatus.java
  • apps/commerce-api/src/main/java/com/loopers/queue/infrastructure/QueueAdmissionScheduler.java
  • apps/commerce-api/src/main/java/com/loopers/queue/infrastructure/RedisWaitingQueue.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/api/QueueV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/api/QueueV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/gate/OrderBulkhead.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/gate/OrderBulkheadInterceptor.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/gate/OrderBulkheadWebConfig.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/gate/QueueGateInterceptor.java
  • apps/commerce-api/src/main/java/com/loopers/queue/interfaces/gate/QueueGateWebConfig.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/queue/application/QueueAdmitterTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/application/QueueFacadeTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/application/QueueMetricsTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/application/QueuePositionInfoTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/application/QueuePropertiesTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/infrastructure/QueueAdmissionSchedulerIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/infrastructure/RedisWaitingQueueFailureTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/infrastructure/RedisWaitingQueueIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/interfaces/api/QueueV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/interfaces/gate/OrderBulkheadApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/interfaces/gate/OrderBulkheadTest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/interfaces/gate/QueueGateApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/queue/interfaces/gate/QueueGateInterceptorTest.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 4dc460e 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