Skip to content

fix: 릴리즈 리뷰 반영 (게이트 빈 입력 방어·설명 5건 정정) - #291

Merged
chanwoo7 merged 2 commits into
developfrom
fix/release-review-docs-and-gate
Sep 9, 2026
Merged

fix: 릴리즈 리뷰 반영 (게이트 빈 입력 방어·설명 5건 정정)#291
chanwoo7 merged 2 commits into
developfrom
fix/release-review-docs-and-gate

Conversation

@chanwoo7

@chanwoo7 chanwoo7 commented Sep 9, 2026

Copy link
Copy Markdown
Member

릴리즈 PR #289의 CodeRabbit 리뷰 8건 처리. 6건 반영 · 1건 미반영 · 1건 false positive.

게이트 결함 (Major)

SDL 파일이 0개일 때 조용히 통과했다. src/를 못 읽으면 모든 카테고리가 0/0percentOf가 100 → 위반 없음 → [docs:check] 통과.

이 게이트가 막으려던 것과 정확히 같은 종류의 거짓 안전이라 실패시킨다.

검증은 종료코드로 했다 — 경로가 없으면 1, 정상이면 0. (처음엔 파이프 끝의 tail 종료코드를 보고 있어서 exit=0이 찍혔다.)

설명이 구현과 어긋난 것

대상 적었던 것 실제
conversationMessages last_read_at현재 시각으로 갱신 반환한 최신 메시지의 created_at까지 끌어올리는 워터마크. 메시지 없으면 갱신 안 함 (conversation.repository.ts:367)
CreateOrderOutput.status 항상 SUBMITTED 같은 idempotencyKey 재시도는 기존 주문을 그대로 반환 → 진행된 상태일 수 있음 (order-checkout.service.ts:70-71)
SellerProductListInput.isActive 미지정 시 노출·미노출 모두 input?.isActive ?? true활성만 (seller-product-query.service.ts:51)
픽업 슬롯 오전/오후 "12:00 이전 / 12:00 이후" 12:00을 양쪽에서 배제하는 것처럼 읽힘. 실제로는 afternoon에 포함

"regularPrice가 표시가다""표시가로 쓰인다" (5개 파일). 제안된 "표시된다"는 의미가 달라져(표시가는 名詞) 표현만 다듬었다.

미반영

감사 로그 spec을 DB mock/stub으로 바꾸라는 지적. 레포 전체가 testcontainers 실 DB 통합 테스트 아키텍처(225 suites)이고 CLAUDE.md가 "DB를 mock하지 않는다" 를 명시 규칙으로 둔다. 이 스펙만 바꾸면 컨벤션 일관성이 훼손된다. 지적한 변동성은 truncateAll 기반 케이스 격리로 다루고 있다.

False positive

OngoingOrderSummary.orderId에 "주문번호" 설명이 붙었다는 지적. 설명은 orderNumber에 붙어 있고 orderId는 자명 필드라 비어 있다 — 코멘트가 docstring 줄에 앵커되며 바로 위 필드의 것으로 읽힌 듯하다.

검증

전체 225 suites 1,874건 + 게이트 스크립트 42건 통과.

CodeRabbit 지적 8건 중 6건 반영, 1건 미반영, 1건 false positive.

게이트 결함:
- SDL 파일이 0개일 때 조용히 통과했다. src/를 못 읽으면 모든 카테고리가 0/0이
  되고 percentOf가 100을 돌려줘 위반 없이 초록불이 뜬다. 이 게이트가 막으려던
  것과 같은 종류의 거짓 안전이라 실패시킨다. 종료코드로 확인: 경로가 없으면 1,
  정상이면 0

설명이 구현과 어긋난 것:
- conversationMessages — last_read_at을 "현재 시각"으로 갱신한다고 적었으나
  실제로는 이번에 반환한 최신 메시지의 created_at까지 끌어올리는 워터마크이고
  반환할 메시지가 없으면 갱신하지 않는다 (conversation.repository.ts:367)
- CreateOrderOutput.status — "항상 SUBMITTED"라 단정했으나 같은 idempotencyKey로
  재시도하면 기존 주문을 그대로 돌려주므로 진행된 상태일 수 있다
  (order-checkout.service.ts:70-71)
- SellerProductListInput.isActive — "미지정 시 노출·미노출 모두"라 적었으나
  input?.isActive ?? true라 활성만 반환한다 (seller-product-query.service.ts:51)
- 픽업 슬롯 오전/오후 — "12:00 이전/이후"가 12:00을 양쪽에서 배제하는 것처럼
  읽힌다. 실제로는 afternoon에 포함된다
- "regularPrice가 표시가다" → "표시가로 쓰인다" (5개 파일). 제안된 "표시된다"는
  의미가 달라 표현만 다듬었다

미반영: 감사 로그 spec을 DB mock으로 바꾸라는 지적. 레포 전체가 testcontainers
실 DB 통합 테스트 아키텍처이고 CLAUDE.md가 "DB를 mock하지 않는다"를 명시 규칙으로
둔다. 이 스펙만 stub으로 바꾸면 컨벤션 일관성이 훼손된다.

false positive: OngoingOrderSummary.orderId에 "주문번호" 설명이 붙었다는 지적.
설명은 orderNumber에 붙어 있고 orderId는 자명 필드라 비어 있다.

전체 1,874건 + 게이트 스크립트 42건 통과.
@coderabbitai

coderabbitai Bot commented Sep 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 55ad7d44-406d-478a-9000-592c77789842

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.

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

🩺 NestJS Doctor — 90/100 (Excellent)

진단 313건 (error 0).

Category error warning info
architecture 0 0 9
correctness 0 161 0
performance 0 27 17
schema 0 0 86
security 0 13 0
architecture / security 상위 항목
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal type 'IAuditLogRepository'.
  • warning security/security/no-exposed-env-vars: Direct 'process.env.NODE_ENV' access in 'AuthController'. Use ConfigService instead.
  • warning security/security/require-guards-on-endpoints: Endpoint 'start' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'callback' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'refresh' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'logout' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'sellerLogin' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'sellerRefresh' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'sellerLogout' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'devIssueToken' has no @UseGuards() at class or method level.
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal module '@/features/conversation/repositories/conversation.repository'.
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal type 'ConversationRepository'.
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal module '@/features/order/repositories/order.repository'.
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal type 'OrderRepository'.
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal module '@/features/product/repositories/product.repository'.

오탐 포함 가능 · 기준 docs/guide/architecture-conventions.md

@min(1)/@max(100)과 전역 ValidationPipe가 범위 밖 limit을 BAD_REQUEST로 거절한다.
normalizeCursorInput의 clamp는 그 뒤라 실제로는 도달하지 않는다. '보정된다'는
서비스 코드만 보고 적은 표현이라 요청 경로와 맞지 않았다.

거절 동작을 유지하고 문구를 맞췄다 — 조용한 값 변경보다 명시적 거절이 낫고 이미
그렇게 동작한다. 같은 문구를 복사해 둔 seller SDL 6개 파일 전부 교체.
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

🧹 knip — dead-code 리포트

Unused dependencies (1)
Duplicate exports (1)
전체 리포트
Unused dependencies (1)
graphql-ws  package.json:65:6
Duplicate exports (1)
KEYWORD_RANK_SNAPSHOT_SIZE|MAX_POPULAR_KEYWORDS_LIMIT  src/features/search/constants/search.constants.ts

청소 후보(오탐 가능) · 기준 docs/guide/architecture-conventions.md

@codecov

codecov Bot commented Sep 9, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

Coverage report

St.
Category Percentage Covered / Total
🟢 Statements 97.62% 5915/6059
🟢 Branches 93.15% 2324/2495
🟢 Functions 96.47% 1176/1219
🟢 Lines 98.2% 5388/5487

Test suite run success

1874 tests passing in 225 suites.

Report generated by 🧪jest coverage report action from ee0e3e1

@chanwoo7
chanwoo7 merged commit 62f5a16 into develop Sep 9, 2026
11 checks passed
@chanwoo7
chanwoo7 deleted the fix/release-review-docs-and-gate branch September 9, 2026 21:09
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.

1 participant