Skip to content

[Volume 4]- 4주차 과제 김평숙#134

Open
katiekim17 wants to merge 54 commits intoLoopers-dev-lab:katiekim17from
katiekim17:volume-4
Open

[Volume 4]- 4주차 과제 김평숙#134
katiekim17 wants to merge 54 commits intoLoopers-dev-lab:katiekim17from
katiekim17:volume-4

Conversation

@katiekim17
Copy link

@katiekim17 katiekim17 commented Mar 4, 2026


📌 Summary

  • 배경: 추가 요구사항으로 쿠폰 발급/사용 기능이 들어 왔음.
  • 목표: 어드민의 쿠폰 관리(생성/수정/삭제)와 유저의 쿠폰 발급/사용(주문 시 적용) 기능 구현
  • 결과: 고정 금액(FIXED) / 비율 할인(RATE) 두 가지 쿠폰 타입을 지원하며, 주문 생성 시 쿠폰을 적용해 최종 결제금액을 산출할 수 있게 됨

🧭 Context & Decision

문제 정의

  • 현재 동작/제약: 주문 생성 시 단순 상품 금액 합산만 가능하며, 할인 적용 수단이 없음
  • 문제(또는 리스크): 쿠폰 발급 수량 초과, 이미 사용된 쿠폰 재사용, 쿠폰 타입 변경으로 인한 정합성 오염
  • 성공 기준: 어드민이 쿠폰을 CRUD할 수 있고, 유저가 쿠폰을 발급받아 주문 시 단 한 번만 사용 가능하며 잔여 수량이 정확히 차감됨

선택지와 결정

  • 고려한 대안:
    • A: 쿠폰 사용 처리를 OrderService 내부에서 처리
    • B: OrderFacade에서 UserCouponService와 OrderService를 함께 조율하고 단일 트랜잭션으로 묶기
  • 최종 결정: B — Facade를 @transactional로 선언해 쿠폰 상태 변경과 주문 생성을 원자적으로 처리
  • 트레이드오프: Facade가 트랜잭션 경계를 가지므로 단위 테스트 시 DB 의존성이 생기지만, 데이터 정합성 보장이 더 중요
  • 추후 개선 여지: 쿠폰 발급 시 동시성 이슈(재고 초과)를 낙관적 락 또는 Redis 분산락으로 보완 가능

🏗️Design Overview

변경 범위

  • 영향 받는 모듈/도메인: coupon (신규), order (기존 변경)
  • 신규 추가:
    • domain/coupon/: Coupon, CouponType, CouponDiscount, CouponService, CouponRepository, UserCoupon, UserCouponStatus, UserCouponService, UserCouponRepository
    • infrastructure/coupon/: CouponJpaRepository, CouponRepositoryImpl, UserCouponJpaRepository, UserCouponRepositoryImpl
    • application/coupon/: CouponFacade, CouponInfo, UserCouponInfo
    • interfaces/api/admin/: AdminCouponApiSpec, AdminCouponController, AdminCouponV1Dto
    • interfaces/api/coupon/: UserCouponApiSpec, UserCouponController, UserCouponV1Dto
    • support/error/ErrorType.java: 쿠폰 관련 에러 8종 추가
  • 제거/대체: 없음

주요 컴포넌트 책임

  • CouponService: 쿠폰 CRUD, 타입 변경 불가 정책(COUPON_TYPE_IMMUTABLE) 강제
  • UserCouponService: 쿠폰 발급(수량 검증), 사용 처리, 상태 관리(ISSUED → USED)
  • CouponFacade: 어드민 쿠폰 관리 유즈케이스 조율
  • OrderFacade: @transactional — 쿠폰 적용 + 주문 생성 원자적 처리, CouponDiscount VO로 할인 정보 전달
  • Order: userCouponId, discountAmount, finalPrice 필드 추가

🔁 Flow Diagram

Main Flow — 쿠폰 적용 주문 생성

  sequenceDiagram
    autonumber
    participant Client
    participant OrderController
    participant OrderFacade
    participant UserCouponService
    participant CouponService
    participant OrderService
    participant DB

    Client->>OrderController: POST /api/v1/orders (userCouponId 포함)
    OrderController->>OrderFacade: createOrder(userId, request)
    OrderFacade->>UserCouponService: use(userCouponId, userId)
    UserCouponService->>DB: UserCoupon 조회 (소유자/상태 검증)
    UserCouponService->>CouponService: getCoupon(couponId)
    CouponService->>DB: Coupon 조회
    CouponService-->>UserCouponService: CouponDiscount (type, value)
    UserCouponService->>DB: UserCoupon.status = USED
    UserCouponService-->>OrderFacade: CouponDiscount
    OrderFacade->>OrderService: createOrder(orderAmount, couponDiscount)
    OrderService->>DB: Order 저장 (discountAmount, finalPrice 포함)
    DB-->>OrderService: Order
    OrderService-->>OrderFacade: Order
    OrderFacade-->>OrderController: OrderInfo
    OrderController-->>Client: ApiResponse<OrderInfo>
Loading

Sub Flow — 쿠폰 발급

  sequenceDiagram
    autonumber
    participant Client
    participant UserCouponController
    participant CouponFacade
    participant UserCouponService
    participant CouponService
    participant DB

    Client->>UserCouponController: POST /api/v1/coupons/{id}/issue
    UserCouponController->>CouponFacade: issueCoupon(userId, couponId)
    CouponFacade->>CouponService: getCoupon(couponId)
    CouponService->>DB: Coupon 조회 (존재/활성 검증)
    CouponFacade->>UserCouponService: issue(userId, coupon)
    UserCouponService->>DB: 중복 발급 여부 확인
    UserCouponService->>DB: 잔여 수량 확인
    UserCouponService->>DB: UserCoupon 저장, Coupon.remainCount--
    DB-->>UserCouponService: UserCoupon
    UserCouponService-->>CouponFacade: UserCouponInfo
    CouponFacade-->>UserCouponController: UserCouponInfo
    UserCouponController-->>Client: ApiResponse<UserCouponInfo>
Loading

katiekim17 and others added 30 commits February 5, 2026 01:01
- 회원가입 시퀀스 다이어그램 (핵심 + 예외 플로우)
- 내 정보 조회 시퀀스 다이어그램 (헤더 인증 포함)
- 비밀번호 변경 시퀀스 다이어그램 (핵심 + 예외 플로우)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
fix : 예제 테스트 코드 오류 해결을 위한 testcontainers 버전 업
Removed the version reference for User entity in requirements.
# Conflicts:
#	docs/design/브랜드_상품/01-requirements.md
#	docs/design/좋아요/01-requirements.md
[2주차] 설계 문서 제출 - 김평숙
@coderabbitai
Copy link

coderabbitai bot commented Mar 4, 2026

Important

Review skipped

Too many files!

This PR contains 178 files, which is 28 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 488a52d3-8dde-437f-a2ff-06fe7b675de6

📥 Commits

Reviewing files that changed from the base of the PR and between 74e22d8 and 5d4b704.

⛔ Files ignored due to path filters (22)
  • .claude/skills/anaylize-query/SKILL.md is excluded by !**/*.md and included by **
  • .claude/skills/requirements-analysis/SKILL.md is excluded by !**/*.md and included by **
  • CLAUDE.md is excluded by !**/*.md and included by **
  • MERMAID.md is excluded by !**/*.md and included by **
  • docs/design/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/03-class-diagram.md is excluded by !**/*.md and included by **
  • docs/design/04-erd.md is excluded by !**/*.md and included by **
  • docs/design/브랜드_상품/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/브랜드_상품/02-sequence-diagrams.md is excluded by !**/*.md and included by **
  • docs/design/어드민/브랜드_상품/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/어드민/브랜드_상품/02-sequence-diagrams.md is excluded by !**/*.md and included by **
  • docs/design/어드민/브랜드_상품/03-class-diagram.md is excluded by !**/*.md and included by **
  • docs/design/어드민/주문/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/좋아요/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/좋아요/02-sequence-diagrams.md is excluded by !**/*.md and included by **
  • docs/design/주문/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/주문/02-sequence-diagrams.md is excluded by !**/*.md and included by **
  • docs/design/주문생성/01-requirements.md is excluded by !**/*.md and included by **
  • docs/design/주문생성/02-sequence-diagrams.md is excluded by !**/*.md and included by **
  • docs/design/주문생성/03-class-diagram.md is excluded by !**/*.md and included by **
  • docs/design/주문생성/04-erd.md is excluded by !**/*.md and included by **
  • docs/design/쿠폰/requirement.md is excluded by !**/*.md and included by **
📒 Files selected for processing (178)
  • .claude/settings.local.json
  • apps/commerce-api/src/main/java/com/loopers/application/brand/AdminBrandFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/brand/AdminBrandInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/brand/BrandFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/brand/BrandInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/coupon/CouponFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/coupon/CouponInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/coupon/UserCouponInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/like/LikeFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/like/LikeListItem.java
  • apps/commerce-api/src/main/java/com/loopers/application/order/OrderDetailInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/order/OrderFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/order/OrderInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/order/OrderItemInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/AdminProductFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/AdminProductInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/OrderFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/ProductDetailInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/ProductFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/ProductHistoryInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/product/ProductListInfo.java
  • apps/commerce-api/src/main/java/com/loopers/application/users/UserFacade.java
  • apps/commerce-api/src/main/java/com/loopers/application/users/UserInfo.java
  • apps/commerce-api/src/main/java/com/loopers/config/AsyncConfig.java
  • apps/commerce-api/src/main/java/com/loopers/config/SecurityConfig.java
  • apps/commerce-api/src/main/java/com/loopers/config/WebMvcConfig.java
  • apps/commerce-api/src/main/java/com/loopers/domain/brand/Brand.java
  • apps/commerce-api/src/main/java/com/loopers/domain/brand/BrandDeactivatedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/domain/brand/BrandEventListener.java
  • apps/commerce-api/src/main/java/com/loopers/domain/brand/BrandRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/brand/BrandStatus.java
  • apps/commerce-api/src/main/java/com/loopers/domain/common/Money.java
  • apps/commerce-api/src/main/java/com/loopers/domain/common/Quantity.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/Coupon.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/CouponDiscount.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/CouponRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/CouponService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/CouponType.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/UserCoupon.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/UserCouponRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/UserCouponService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/coupon/UserCouponStatus.java
  • apps/commerce-api/src/main/java/com/loopers/domain/like/Like.java
  • apps/commerce-api/src/main/java/com/loopers/domain/like/LikeCreatedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/domain/like/LikeDeletedEvent.java
  • apps/commerce-api/src/main/java/com/loopers/domain/like/LikeEventListener.java
  • apps/commerce-api/src/main/java/com/loopers/domain/like/LikeRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/like/LikeService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/Order.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/OrderItem.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/OrderItemRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/OrderItemStatus.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/OrderRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/OrderService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/OrderStatus.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/ProductSnapshot.java
  • apps/commerce-api/src/main/java/com/loopers/domain/order/StockDeductionService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/Product.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductHistory.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductHistoryRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductImage.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductImageRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductImageService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductOption.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductOptionRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductOptionService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductOptionStatus.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/domain/product/ProductSortType.java
  • apps/commerce-api/src/main/java/com/loopers/domain/product/ProductStatus.java
  • apps/commerce-api/src/main/java/com/loopers/domain/stock/Stock.java
  • apps/commerce-api/src/main/java/com/loopers/domain/stock/StockRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/UserRepository.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/UserService.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/Users.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/vo/Email.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/vo/EncryptedPassword.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/vo/LoginId.java
  • apps/commerce-api/src/main/java/com/loopers/domain/users/vo/RawPassword.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/brand/BrandEntity.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/brand/BrandJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/brand/BrandRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/coupon/CouponJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/coupon/CouponRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/coupon/UserCouponJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/coupon/UserCouponRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderEntity.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderItemEntity.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderItemJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderItemRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductEntity.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductHistoryJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductHistoryRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductImageEntity.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductImageJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductImageRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductOptionEntity.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductOptionJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductOptionRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/stock/StockJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/stock/StockRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/users/UserJpaRepository.java
  • apps/commerce-api/src/main/java/com/loopers/infrastructure/users/UserRepositoryImpl.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminAuthInterceptor.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminBrandV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminController.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminCouponApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminCouponController.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminCouponV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminProductV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/admin/AdminV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/brand/BrandController.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/brand/BrandV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/brand/BrandV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/coupon/UserCouponApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/coupon/UserCouponController.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/coupon/UserCouponV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/like/LikeController.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/like/LikeV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/like/LikeV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/order/OrderController.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/order/OrderV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/order/OrderV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/product/ProductV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/product/ProductsV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/product/ProductsV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/users/UserV1ApiSpec.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/users/UserV1Controller.java
  • apps/commerce-api/src/main/java/com/loopers/interfaces/api/users/UserV1Dto.java
  • apps/commerce-api/src/main/java/com/loopers/support/error/ErrorType.java
  • apps/commerce-api/src/test/java/com/loopers/domain/brand/BrandTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/common/MoneyTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/common/QuantityTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/coupon/CouponServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/coupon/CouponTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/coupon/UserCouponServiceConcurrencyTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/coupon/UserCouponServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/coupon/UserCouponTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/like/LikeServiceConcurrencyTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/order/OrderItemTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/order/OrderServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/order/OrderTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/order/ProductSnapshotTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/product/ProductServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/product/ProductTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/stock/StockDeductionServiceConcurrencyTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/stock/StockDeductionServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/stock/StockTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/users/UsersServiceIntegrationTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/users/UsersTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/users/vo/EmailTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/users/vo/LoginIdTest.java
  • apps/commerce-api/src/test/java/com/loopers/domain/users/vo/RawPasswordTest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/AdminCouponV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/AdminV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/BrandV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/LikeV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/OrderV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/ProductsV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/UserCouponV1ApiE2ETest.java
  • apps/commerce-api/src/test/java/com/loopers/interfaces/api/UsersV1ApiE2ETest.java
  • build.gradle.kts
  • docker/infra-compose.yml
  • gradle.properties
  • http/commerce-api/admin-brand-v1.http
  • http/commerce-api/admin-product-v1.http
  • http/commerce-api/brand-v1.http
  • http/commerce-api/like-v1.http
  • http/commerce-api/order-v1.http
  • http/commerce-api/products-v1.http
  • modules/jpa/src/main/resources/jpa.yml

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


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 and usage tips.

@katiekim17 katiekim17 changed the title [Volume 4]- 김평숙 [Volume 4]- 4주차 과제 김평숙 Mar 5, 2026
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.

3 participants