Skip to content

Conversation

@wlghsp
Copy link
Collaborator

@wlghsp wlghsp commented Nov 7, 2025

📌 Summary

  • 요구사항 명세서 작성 (01-requirements.md)
  • 시퀀스 다이어그램 작성 (02-sequence-diagrams.md)
  • 클래스다이어그램 도메인 객체별 상세 설명 (03-class-diagram.md)
  • ERD 및 테이블별 상세 설명 (04-erd.md)

💬 Review Points

  1. 좋아요 기능의 멱동성
  • DB: Like 테이블에 복합 유니크 제약조건
  • Application: 좋아요 존재 여부 확인 후 분기 처리
  1. 재고 및 포인트 동시성 제어
  • 재고 및 포인트 변경 시 비관적 락 (SELECT FOR UPDATE) 적용
  • 외부 시스템 연동을 트랜잭션 범위에 포함하고 실패 시 트랜잭션 롤백
  1. 좋아요 수 비정규화
  • 조회 성능 향상을 위해 좋아요 수 Product 테이블에 기록

✅ Checklist

  • 상품/브랜드/좋아요/주문 도메인이 모두 포함되어 있는가?
  • 기능 요구사항이 유저 중심으로 정리되어 있는가?
  • 시퀀스 다이어그램에서 책임 객체가 드러나는가?
  • 클래스 구조가 도메인 설계를 잘 표현하고 있는가?
  • ERD 설계 시 데이터 정합성을 고려하여 구성하였는가?

📎 References

@coderabbitai
Copy link

coderabbitai bot commented Nov 7, 2025

Walkthrough

제품, 좋아요, 주문 기능을 위한 종합 설계 문서 모음이 추가되었습니다. 유비쿼터스 언어, 요구사항, 시퀀스 다이어그램, 클래스 다이어그램, ERD를 포함한 5개의 설계 문서가 .docs/design/ 디렉토리에 추가되었으며, 코드 기능상 변경은 없습니다.

Changes

Cohort / File(s) 설명
설계 문서 추가
.docs/design/00-ubiquitous-language.md, .docs/design/01-requirements.md, .docs/design/02-sequence-diagrams.md, .docs/design/03-class-diagram.md, .docs/design/04-erd.md
Member, Product, Brand, Like, Order, OrderItem, Point, Stock 등의 도메인 개념을 정의한 유비쿼터스 언어 표 추가. 제품 검색 필터링, 좋아요 관리, 주문 생성 및 결제 흐름에 대한 사용자 스토리와 요구사항 문서 추가. 4개 시퀀스 다이어그램(상품 목록 조회, 좋아요 목록 조회, 좋아요 등록, 좋아요 취소)을 설명하는 문서 추가. 도메인 엔티티 관계와 값 객체 설계(Money, Stock, Quantity, MemberId, Point 등)를 포함한 클래스 다이어그램 문서 추가. members, brands, products, likes, orders, order_items, points, point_histories 테이블의 필드, 타입, 제약조건을 정의한 ERD 및 관계도 추가.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

  • 설계 문서만 추가되어 코드 기능상 변경 사항이 없음
  • 문서 내용의 일관성 및 명확성 확인 필요
  • 도메인 모델, ERD, 시퀀스 다이어그램 간 논리적 일관성 검토

Poem

🐰 설계도를 모아 모아
도메인의 세상을 그려
한글과 영문이 춤을 추고
ERD와 시퀀스가 노래해 ✨
질서 정연한 구조로 비상!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 PR의 주요 변경사항인 설계 문서 제출을 명확하게 표현하고 있으며, 주차(2주차)와 작성자 정보도 포함되어 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed PR 설명이 리포지토리의 템플릿 구조를 완벽하게 따르고 있으며, 요약, 리뷰 포인트, 체크리스트, 참고자료 섹션이 모두 충실하게 작성되어 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
.docs/design/04-erd.md (1)

206-222: Point 동시성 제어 방안 명시 필요

points 테이블의 동시성 제어 필요성이 주석으로 표시되어 있습니다(라인 218). 다음과 같이 보다 구체적인 구현 가이드를 추가하는 것을 권장합니다:

**비고:**
- 동시성 제어 필요 (비관적 락)
- 한 사용자당 하나의 포인트 레코드
+ - 구현 방식: JPA @Lock(LockModeType.PESSIMISTIC_WRITE)
+ - 또는 SELECT ... FOR UPDATE 쿼리 사용

이렇게 명시하면 향후 구현 시 동시성 전략이 더욱 명확해집니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b0883a9 and 8342e74.

📒 Files selected for processing (5)
  • .docs/design/00-ubiquitous-language.md (1 hunks)
  • .docs/design/01-requirements.md (1 hunks)
  • .docs/design/02-sequence-diagrams.md (1 hunks)
  • .docs/design/03-class-diagram.md (1 hunks)
  • .docs/design/04-erd.md (1 hunks)
🔇 Additional comments (16)
.docs/design/00-ubiquitous-language.md (1)

1-12: 설계 문서의 기초로 명확하게 정의됨

유비쿼터스 언어가 간결하게 정리되어 있으며, 후속 설계 문서들(요구사항, 클래스 다이어그램, ERD)과 일관되게 사용되고 있습니다. 각 용어에 대한 설명도 충분합니다.

.docs/design/01-requirements.md (1)

1-96: 요구사항이 체계적으로 구조화됨

Main Flow, Alternate Flow, Exception Flow로 명확하게 구분되어 있으며, HTTP 메서드, 에러 코드, 멱등성 요구사항이 명시되어 있습니다. 외부 시스템 연동 시 트랜잭션 롤백 전략(라인 93)과 동시성 제어 필요성(라인 78-79)도 적절하게 문서화되어 있습니다.

.docs/design/02-sequence-diagrams.md (4)

1-41: 계층 구조와 흐름이 명확함

첫 번째 시퀀스 다이어그램이 Controller → Facade → Service → Repository 계층을 잘 보여주고 있으며, 요청 검증(X-USER-ID 헤더, 정렬 옵션, 페이지 파라미터)과 비정규화된 likes_count 조회도 명시되어 있습니다.


50-83: 내 좋아요 목록 조회 흐름이 적절함

Like 엔티티에서 상품 정보, 브랜드명, 등록 시간을 추출하는 과정이 명시되어 있으며, 페이지네이션 처리도 명확합니다.


88-143: 좋아요 등록 멱등성 처리가 적절함

좋아요 등록 시 이미 존재하는 경우 중복 생성 방지(라인 133-136)와 상품 없음 예외 처리(라인 116-120)가 명시적으로 표시되어 있습니다.


148-199: 좋아요 취소 멱등성 처리가 적절함

취소할 좋아요가 없는 경우 멱등성을 보장하여 오류 없이 성공 응답을 반환하는 설계(라인 189-192)가 좋습니다.

.docs/design/03-class-diagram.md (4)

1-71: 도메인 모델 설계가 명확하게 시각화됨

Mermaid 클래스 다이어그램이 엔티티 간 관계와 책임을 잘 표현하고 있습니다. 양방향 연관관계(Brand ↔ Product, Order ↔ OrderItem)와 cascade 전략도 주석으로 설명되어 있습니다.


38-47: Order와 Member 관계 정의 확인 필요

Order 엔티티가 userId를 String 타입으로 정의(라인 39)하고 있는 반면, Like 엔티티는 Member 객체 참조(라인 34)를 사용하고 있습니다.

ERD 문서(04-erd.md 라인 51)에서 orders.user_id를 FK로 정의했다면, Order가 Member 엔티티를 참조하도록 설계하는 것이 일관성 있을 것으로 보입니다.

확인 사항:

  • Order가 Member를 직접 참조하지 않은 이유가 있는지
  • user_id를 String으로 유지하는 대신 memberId 참조로 변경할 가능성

이는 라인 39 변경과 클래스 다이어그램의 관계선 추가(Order → Member)로 반영될 수 있습니다.


200-220: Point의 동시성 제어 명시 및 설계가 적절함

Point 엔티티가 Member와 1:1 관계를 가지고 있으며, 비관적 락(pessimistic lock) 적용 대상으로 명시(라인 218)되어 있어 동시성 제어 전략이 명확합니다.


224-288: Value Object 설계가 일관성 있고 완전함

Money, Stock, Quantity 등 VO의 불변성(Immutability), 검증(validation), 연산 메서드가 명확하게 정의되어 있습니다. 특히 음수 방지(라인 244, 267, 285)와 경계값 검증(Quantity 최소 1개)이 잘 명시되어 있습니다.

.docs/design/04-erd.md (6)

71-78: Point와 Member의 관계 명확화 필요

points.user_id는 UK,FK로 정의되었으나(라인 73), 이것이 members.id(BIGINT)를 참조하는지, 아니면 members.user_id(VARCHAR UK)를 참조하는지 명확하지 않습니다.

설계 의도를 명시하기 위해 다음과 같이 수정을 권장합니다:

points {
    bigint id PK
-   varchar user_id UK,FK
+   varchar user_id UK,FK "references members(user_id)"
    bigint balance
    ...
}

또는 BIGINT 기반 FK를 사용하려면:

points {
    bigint id PK
    bigint member_id UK,FK "references members(id)"
    bigint balance
    ...
}

105-148: members 및 products 테이블 설계가 적절함

members 테이블의 soft delete 패턴(deleted_at, 라인 116)과 UNIQUE 제약조건(user_id, 라인 110), products의 비정규화된 likes_count(라인 144)와 동시성 제어 필요성(라인 151)이 명시적으로 기록되어 있습니다.


155-170: likes 테이블 설계 - 멱등성 보장 명시됨

likes 테이블의 복합 UNIQUE 인덱스 필요성(라인 167)이 명시되어 있어, (member_id, product_id) 조합으로 중복 좋아요를 방지하고 멱등성을 보장합니다.

-- 암묵적 요구사항: 다음 제약조건 추가 필요
UNIQUE KEY uk_member_product (member_id, product_id)

이를 테이블 설정에 명시하는 것을 권장합니다.


186-203: order_items 설계 - 데이터 무결성 고려 좋음

order_items 테이블이 주문 당시 가격 저장(price, 라인 194)과 소계 저장(subtotal, 라인 195)을 분리하여 설계한 것이 좋습니다. 이를 통해 상품 가격 변동과 무관하게 주문 이력을 정확하게 보존할 수 있습니다.


224-240: point_histories 감사 추적 설계가 적절함

point_histories 테이블이 거래 유형(transaction_type), 금액, 거래 후 잔액(balance_after)을 기록하여 포인트 변동을 완전히 추적할 수 있도록 설계되어 있습니다. 이는 재무 감시(audit trail) 요구사항을 잘 충족합니다.


1-99: ERD 관계선 정의 불완전 - 데이터 무결성 문제

Mermaid ERD 다이어그램(라인 5-99)에서 다음 관계가 누락되거나 불명확합니다:

  1. orders ↔ members 관계 누락

    • orders 테이블이 user_id(VARCHAR) FK를 가지고 있으나(라인 51), 다이어그램의 관계선(라인 91-98)에 orders → members 관계가 정의되지 않았습니다.
  2. points ↔ members 관계 누락

    • points.user_id는 UK,FK로 정의되었으나(라인 73), 관계선에 points → members 관계가 정의되지 않았습니다.

이를 다음과 같이 수정하는 것을 권장합니다:

  members ||--o{ points : "owns"
  points ||--o{ point_histories : "has"
+ members ||--o{ orders : "places"
+ orders ||--o{ order_items : "contains"
+ products ||--o{ order_items : "referenced in"

라인 94-96 부분을 검토하고 위 관계들이 올바르게 정의되었는지 확인하세요.

Likely an incorrect or invalid review comment.

Comment on lines +45 to +66
## 2. 내가 좋아요한 상품 목록 조회

### 시나리오
사용자가 자신이 좋아요한 상품 목록을 조회합니다.

```mermaid
sequenceDiagram
participant Client
participant LikeV1Controller
participant LikeFacade
participant LikeService
participant LikeRepository

Client->>LikeV1Controller: GET /api/v1/like/products?page=0&size=20
Note over Client,LikeV1Controller: Header: X-USER-ID

LikeV1Controller->>LikeV1Controller: X-USER-ID 헤더 검증

alt X-USER-ID 헤더 누락
LikeV1Controller-->>Client: ApiResponse(400, "X-USER-ID 헤더 정보 누락입니다.")
else 유효하지 않은 페이지 파라미터 (음수)
ProductV1Controller-->>Client: ApiResponse(400, "유효하지 않은 페이지 파라미터입니다.")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

복사-붙여넣기 오류 수정 필요

라인 66에서 "ProductV1Controller"로 잘못된 컨트롤러 이름이 참조되고 있습니다. 문맥상 "LikeV1Controller"로 수정되어야 합니다. 이는 라인 53의 LikeV1Controller 시퀀스 다이어그램에서의 오류입니다.

-        ProductV1Controller-->>Client: ApiResponse(400, "유효하지 않은 페이지 파라미터입니다.")
+        LikeV1Controller-->>Client: ApiResponse(400, "유효하지 않은 페이지 파라미터입니다.")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
## 2. 내가 좋아요한 상품 목록 조회
### 시나리오
사용자가 자신이 좋아요한 상품 목록을 조회합니다.
```mermaid
sequenceDiagram
participant Client
participant LikeV1Controller
participant LikeFacade
participant LikeService
participant LikeRepository
Client->>LikeV1Controller: GET /api/v1/like/products?page=0&size=20
Note over Client,LikeV1Controller: Header: X-USER-ID
LikeV1Controller->>LikeV1Controller: X-USER-ID 헤더 검증
alt X-USER-ID 헤더 누락
LikeV1Controller-->>Client: ApiResponse(400, "X-USER-ID 헤더 정보 누락입니다.")
else 유효하지 않은 페이지 파라미터 (음수)
ProductV1Controller-->>Client: ApiResponse(400, "유효하지 않은 페이지 파라미터입니다.")
## 2. 내가 좋아요한 상품 목록 조회
### 시나리오
사용자가 자신이 좋아요한 상품 목록을 조회합니다.
🤖 Prompt for AI Agents
.docs/design/02-sequence-diagrams.md lines 45-66: fix the copy-paste error where
the sequence diagram uses "ProductV1Controller" on line 66 but should reference
"LikeV1Controller"; update that controller name to "LikeV1Controller" so the alt
branch matches the rest of the Like flow and the error response line reads
LikeV1Controller-->>Client: ApiResponse(400, "유효하지 않은 페이지 파라미터입니다.")

Comment on lines +49 to +57
orders {
bigint id PK
varchar user_id FK
varchar status
bigint total_amount
timestamptz created_at
timestamptz updated_at
timestamptz deleted_at
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

데이터 타입 불일치 - FK 관계 정의 필요

orders 테이블의 user_id가 VARCHAR FK로 정의되어 있으나, members.id는 BIGINT PK입니다(라인 8).

두 가지 해결 방안:

옵션 1: members.id → orders.user_id로 통일 (권장)

  • members.user_id(VARCHAR)를 FK 대상으로 지정하되, orders.user_id의 제약조건을 명시:
orders {
    bigint id PK
-   varchar user_id FK
+   varchar user_id FK "references members(user_id)"
    varchar status
    ...
}

옵션 2: orders에 member_id(BIGINT FK) 추가

orders {
    bigint id PK
    bigint member_id FK "references members(id)"
    varchar status
    ...
}

현재 설계에서는 orders.user_id가 members.user_id를 참조하도록 명시하는 것이 데이터 무결성 측면에서 더 안전할 것으로 보입니다.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
orders {
bigint id PK
varchar user_id FK
varchar status
bigint total_amount
timestamptz created_at
timestamptz updated_at
timestamptz deleted_at
}
orders {
bigint id PK
varchar user_id FK "references members(user_id)"
varchar status
bigint total_amount
timestamptz created_at
timestamptz updated_at
timestamptz deleted_at
}
🤖 Prompt for AI Agents
.docs/design/04-erd.md around lines 49-57: orders.user_id is defined as VARCHAR
but members.id is BIGINT (line 8), causing a type mismatch for FK relationships;
fix by making the FK relationship explicit and ensuring types match — either (A)
change orders.user_id to BIGINT and declare it as FK referencing members.id, or
(B, preferred) ensure members exposes a VARCHAR user_id primary/unique key and
add an explicit FK constraint on orders.user_id -> members.user_id (and document
the constraint in the ERD); update the column types and add the FK notation so
the ER diagram unambiguously enforces referential integrity.

@wlghsp wlghsp merged commit b83d4a9 into Loopers-dev-lab:wlghsp Nov 9, 2025
1 check 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.

1 participant