Skip to content

Conversation

@JVHE
Copy link
Collaborator

@JVHE JVHE commented Nov 7, 2025

πŸ“Œ Summary

"μš°λ¦¬κ°€ ν•¨κ»˜ λ§Œλ“€μ–΄κ°ˆ 단 ν•˜λ‚˜μ˜ 감성 이컀머슀"의 κ°„λ‹¨ν•œ κΈ°λŠ₯ 섀계λ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.
섀계 λ²”μœ„λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

- **섀계 λ²”μœ„**
    - μƒν’ˆ λͺ©λ‘ / μƒν’ˆ 상세 / λΈŒλžœλ“œ 쑰회
    - μƒν’ˆ μ’‹μ•„μš” 등둝/μ·¨μ†Œ (λ©±λ“± λ™μž‘)
    - μ£Όλ¬Έ 생성 및 결제 흐름 (재고 차감, 포인트 차감, μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동)
- **μ œμ™Έ 도메인**
    - νšŒμ›κ°€μž…, 포인트 μΆ©μ „ (1μ£Όμ°¨ κ΅¬ν˜„ μ™„λ£Œ κΈ°μ€€)
- **μš”κ΅¬μ‚¬ν•­ 기반**
    - λ£¨ν”„νŒ© 이컀머슀 μ‹œλ‚˜λ¦¬μ˜€ λ¬Έμ„œλ₯Ό κΈ°μ€€μœΌλ‘œ κΈ°λŠ₯/μ œμ•½μ‚¬ν•­μ„ 섀계에 λ°˜μ˜ν•©λ‹ˆλ‹€.

μ§„ν–‰ λ‚΄μš©μ€ reuquirements와 sequence diagramμž…λ‹ˆλ‹€.

πŸ’¬ Review Points

  • μΆ”ν›„ 개발되면 μ’‹κ² λ‹€ 싢은 λ‚΄μš©λ“€μ„ κ°„λ‹¨ν•˜κ²Œ TBD파트둜 μΆ”κ°€ν•˜μ—¬ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. 뢄리할 곳이 λ”°λ‘œ μ—†μ–΄ ν•œ 곳에 λ¬Άμ–΄λ‘μ—ˆλŠ”λ°, κΈ°νšμ„œ μ½λŠ” μž…μž₯μ—μ„œ μžˆλŠ”κ²Œ 쒋을지 μ—†λŠ”κ²Œ 쒋을지 생각이 κΆκΈˆν•©λ‹ˆλ‹€.
  • λ©±λ“± λ™μž‘μ„ 생각할 λ•Œ, κ³ λ € μš”μ†ŒλŠ” ν–‰μœ„μ™€ 영ν–₯을 μ£ΌλŠ” μƒνƒœλ‘œ μž‘μ•„μ•Ό ν• κΉŒμš”? μ’‹μ•„μš”λ₯Ό 예둜 듀어보면 ν–‰μœ„(μ’‹μ•„μš”/ν•΄μ œ), ν˜„μž¬μƒνƒœ(Y/N)인 경우 4κ°€μ§€ 쑰합이 λ‚˜μ˜€λŠ”λ°, 4κ°€μ§€ μ‘°ν•©μœΌλ‘œ 멱등성을 λ‚˜λˆŒμ§€, 행동 κΈ°μ€€λ§Œ κ°€μ§€κ³  λ‚˜λˆŒμ§€κ°€ 고민이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

βœ… Checklist

πŸ“Ž References

Summary by CodeRabbit

λ¬Έμ„œν™”

  • 도메인 λͺ¨λΈλ§ 및 μ‹œμŠ€ν…œ 섀계 μ›Œν¬ν”Œλ‘œμš°μ— λŒ€ν•œ μ’…ν•© μ„€λͺ…μ„œ μΆ”κ°€
  • μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨, 클래슀 λ‹€μ΄μ–΄κ·Έλž¨, ERD 섀계 방법둠 및 μ‹€μ œ μ˜ˆμ‹œ 포함
  • 섀계 및 기술 μž‘μ„± 과제 κ°€μ΄λ“œλΌμΈκ³Ό 제좜 체크리슀트 μΆ”κ°€
  • μƒν’ˆ, λΈŒλžœλ“œ, μ£Όλ¬Έ κΈ°λŠ₯을 ν¬ν•¨ν•œ e-컀머슀 ν”Œλž«νΌ μš”κ΅¬μ‚¬ν•­ λͺ…μ„Έμ„œ μΆ”κ°€

@coderabbitai
Copy link

coderabbitai bot commented Nov 7, 2025

Walkthrough

BE L2 Round 2 도메인 섀계 및 기술 λ¬Έμ„œ μž‘μ„±μ„ μœ„ν•œ μ’…ν•© λ¬Έμ„œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. e-commerce ν”Œλž«νΌμ˜ μš”κ΅¬μ‚¬ν•­, μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨, 클래슀 λ‹€μ΄μ–΄κ·Έλž¨, ERD 섀계 및 ν€˜μŠ€νŠΈ κ°€μ΄λ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

Changes

μ½”ν˜ΈνŠΈ / 파일 λ³€κ²½ μš”μ•½
μ£Όκ°„ 섀계 κ°€μ΄λ“œ
docs/week02.md
도메인 λͺ¨λΈλ§, μ‹œμŠ€ν…œ 섀계, μ‹œν€€μŠ€/클래슀 λ‹€μ΄μ–΄κ·Έλž¨, ERD 섀계λ₯Ό λ‹€λ£¨λŠ” BE L2 Round 2 μ’…ν•© ꡐ윑 자료 μΆ”κ°€
ν€˜μŠ€νŠΈ 및 μš”κ΅¬μ‚¬ν•­
docs/week02_quests.md, docs/week2/01-requirements.md
Round 2 ν€˜μŠ€νŠΈ κ°€μ΄λ“œ(섀계/기술 λ¬Έμ„œ μž‘μ„± ν€˜μŠ€νŠΈ, 제좜 ν˜•μ‹ 및 체크리슀트) 및 Looppack e-commerce ν”Œλž«νΌμ˜ 상세 μš”κ΅¬μ‚¬ν•­ λ¬Έμ„œ μΆ”κ°€

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

  • 순수 λ¬Έμ„œ μΆ”κ°€λ‘œ μ½”λ“œ 변경이 μ—†μŒ
  • μΌκ΄€λœ ꡬ쑰의 λ§ˆν¬λ‹€μš΄ νŒŒμΌλ“€λ‘œ κ²€ν†  λ³΅μž‘λ„ μ΅œμ†Œν™”
  • μš”κ΅¬μ‚¬ν•­ 및 κ°€μ΄λ“œ λ¬Έμ„œμ˜ λ‚΄μš© μ •ν™•μ„±κ³Ό 완성도 확인 ν•„μš”

Poem

πŸ“š μ£Όκ°„ 섀계, μš”κ΅¬μ‚¬ν•­μ˜ μ§‘ν•©
도메인 λͺ¨λΈμ΄ 좀을 μΆ˜λ‹€
μ‹œν€€μŠ€μ™€ ERD의 ν•˜λͺ¨λ‹ˆ
🐰 ν† λΌμ˜ κ°€μ΄λ“œλ‘œ ν•¨κ»˜
μ™„λ²½ν•œ μ„€κ³„μ˜ 길을 달린닀! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive 제λͺ© 'Round2'λŠ” λ³€κ²½μ‚¬ν•­μ˜ μ£Όμš” λ‚΄μš©μ„ ꡬ체적으둜 μ„€λͺ…ν•˜μ§€ μ•ŠμœΌλ©°, μ‹€μ œ λ³€κ²½ λ‚΄μš©(docs/week02.md, docs/week02_quests.md, docs/week2/01-requirements.md μΆ”κ°€)과의 연결성이 뢈λͺ…ν™•ν•©λ‹ˆλ‹€. 제λͺ©μ„ 'Add week 2 documentation and quest guidelines' 같이 더 ꡬ체적으둜 μˆ˜μ •ν•˜μ—¬ λ³€κ²½μ‚¬ν•­μ˜ μ‹€μ œ λ‚΄μš©μ„ λͺ…ν™•νžˆ μ „λ‹¬ν•΄μ£Όμ„Έμš”.
βœ… Passed checks (2 passed)
Check name Status Explanation
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: 0

🧹 Nitpick comments (12)
docs/week2/01-requirements.md (4)

124-150: μ’‹μ•„μš” κΈ°λŠ₯의 λ©±λ“±μ„±(Idempotency) λͺ…μ‹œ ν•„μš”.

ν˜„μž¬ κΈ°λ³Έ μš”κ΅¬μ‚¬ν•­(137-139ν–‰)μ—μ„œ "λ“±λ‘ν•˜κ³ , μ·¨μ†Œλ©΄ μ’‹μ•„μš”λ₯Ό μ‚­μ œν•œλ‹€"λŠ” ν‘œν˜„λ§Œ μžˆμ–΄ ν† κΈ€ λ™μž‘μ˜ 멱등성이 λͺ…ν™•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

"λ©±λ“±μ„± λ™μž‘ 지원"μ΄λΌλŠ” ν‘œν˜„μ€ μžˆμ§€λ§Œ, μ‹€μ œ 섀계 μ‹œ μ€‘μš”ν•œ μ œμ•½ 사항이 μžˆμŠ΅λ‹ˆλ‹€. ν•™μŠ΅μžλ“€μ΄ λ‹€μŒμ„ μ΄ν•΄ν•˜λ„λ‘ λͺ…μ‹œν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€:

  • 같은 μ‚¬μš©μžκ°€ 동일 μƒν’ˆμ— λŒ€ν•΄ λ™μΌν•œ μ’‹μ•„μš” μš”μ²­μ„ μ—¬λŸ¬ 번 보내도 μ΅œμ’… μƒνƒœλŠ” 동일해야 함
  • 이λ₯Ό μœ„ν•΄ μ’‹μ•„μš” 쑴재 μ—¬λΆ€λ₯Ό λ¨Όμ € ν™•μΈν•œ ν›„ create/delete 둜직이 ν•„μš”ν•¨
  • μ΄λŠ” λ‹¨μˆœ toggle이 μ•„λ‹ˆλΌ μƒνƒœ 기반 λ©±λ“± μ—°μ‚°μž„

λ‹€μŒκ³Ό 같이 μ œμ•½μ‚¬ν•­ μ„Ήμ…˜μ„ κ°•ν™”ν•˜λ©΄ ν•™μŠ΅μžμ˜ 섀계 λ°©ν–₯이 더 λͺ…ν™•ν•΄μ§ˆ 것 κ°™μŠ΅λ‹ˆλ‹€:

#### μ œμ•½μ‚¬ν•­

μ’‹μ•„μš”λŠ” μƒν’ˆλ³„λ‘œλ§Œ, λΈŒλžœλ“œ μ’‹μ•„μš”λŠ” μ œμ™Έ.
μ΅œλŒ€ μ’‹μ•„μš” 수 μ œν•œ μ—†μŒ.

**λ©±λ“±μ„± μš”κ΅¬μ‚¬ν•­ (μ€‘μš”)**:
- 같은 μ‚¬μš©μžκ°€ 동일 μƒν’ˆμ— λŒ€ν•΄ μ—¬λŸ¬ 번 μ’‹μ•„μš” μš”μ²­μ„ 보내도 μ΅œμ’… μƒνƒœλŠ” 동일해야 함
- μš”μ²­ 1: `POST /products/{id}/like` β†’ μ’‹μ•„μš” 등둝 (μƒνƒœ λ³€κ²½)
- μš”μ²­ 1 μž¬μ „μ†‘: `POST /products/{id}/like` β†’ 이미 μ’‹μ•„μš”λ¨, μƒνƒœ λ³€κ²½ μ—†μŒ (동일 κ²°κ³Ό)

μ΄λ ‡κ²Œ ν•˜λ©΄ RabbitMQ, λ„€νŠΈμ›Œν¬ μž¬μ‹œλ„ λ“± μ‹€λ¬΄μ—μ„œμ˜ λ©±λ“±μ„± ν•„μš”μ„±κ³Όλ„ μžμ—°μŠ€λŸ½κ²Œ μ—°κ²°λ©λ‹ˆλ‹€.

[/suggest_recommended_refactor]


151-176: μ£Όλ¬Έ 생성 μ‹œ λ™μ‹œμ„± 문제(Race Condition) 섀계 κ°€μ΄λ“œ λΆ€μž¬.

ν˜„μž¬ κΈ°λ³Έ μš”κ΅¬μ‚¬ν•­(167-169ν–‰)μ—μ„œ "재고 차감", "포인트 차감"만 λͺ…μ‹œλ˜μ–΄ μžˆμ§€λ§Œ, 싀무 e-commerce의 핡심 문제인 λ™μ‹œμ„± μ œμ–΄κ°€ μΆ©λΆ„νžˆ 닀루어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

두 μ‚¬μš©μžκ°€ λ§ˆμ§€λ§‰ 재고 μƒν’ˆμ„ λ™μ‹œμ— κ΅¬λ§€ν•˜λ € ν•  λ•Œ, 재고 확인과 차감 μ‚¬μ΄μ˜ race condition으둜 인해 μ΅œμ’… μž¬κ³ κ°€ μŒμˆ˜κ°€ 될 수 있으며, λΆ„μ‚° μž κΈˆμ„ 톡해 재고 μ—…λ°μ΄νŠΈκ°€ μ›μžμ μ΄κ³  일관성 있게 보μž₯λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒ λ‚΄μš©μ„ TBD λ˜λŠ” μ œμ•½μ‚¬ν•­ μ„Ήμ…˜μ— μΆ”κ°€ν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€:

#### TBD: ν˜„μž¬ κ³ λ € 쀑인 μΆ”κ°€ μš”κ΅¬μ‚¬ν•­

- **λ™μ‹œμ„± μ œμ–΄ (Concurrency Control)**
  - 두 μ‚¬μš©μžκ°€ λ™μ‹œμ— λ§ˆμ§€λ§‰ 재고λ₯Ό ꡬ맀 μ‹œλ„ν•  λ•Œ 처리 방식
  - 재고 확인(`SELECT`)κ³Ό 차감(`UPDATE`)이 μ›μžμ μœΌλ‘œ μˆ˜ν–‰λ˜μ–΄μ•Ό 함
  - 예: `UPDATE products SET stock = stock - 1 WHERE id = ? AND stock > 0`
  - μ‹€νŒ¨ μ‹œ λͺ…ν™•ν•œ "ν’ˆμ ˆ" μ—λŸ¬ λ°˜ν™˜

#### μ œμ•½μ‚¬ν•­

- μž¬κ³ κ°€ 0 μ΄ν•˜λ‘œ λ–¨μ–΄μ§€μ§€ μ•Šμ•„μ•Ό 함 (음수 재고 λ°©μ§€)
- 재고 확인과 차감 μ‚¬μ΄μ˜ race condition λ°©μ§€

이λ₯Ό 톡해 ν•™μŠ΅μžλ“€μ΄ 섀계 μ‹œ λ™μ‹œμ„±μ„ κ³ λ €ν•˜κ³ , 후속 κ΅¬ν˜„ λ‹¨κ³„μ—μ„œ Lock μ „λž΅(pessimistic locking, optimistic locking)μ΄λ‚˜ νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ„ μ„ νƒν•˜λ„λ‘ μœ λ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

[/suggest_recommended_refactor]


48-49: μ •λ ¬ κΈ°λŠ₯의 인기순 μ •μ˜ λΆ€μ‘±.

48ν–‰μ˜ "인기순: μ’‹μ•„μš” 수 κΈ°μ€€"은 μ’‹μ§€λ§Œ, λ‹€μŒμ΄ 뢈λͺ…ν™•ν•©λ‹ˆλ‹€:

  • μ‹œκ°„ λ²”μœ„: 전체 κΈ°κ°„? 졜근 30일?
  • 동점 처리: μ’‹μ•„μš” μˆ˜κ°€ 같은 경우 μ–΄λ–»κ²Œ μ •λ ¬?
- μ •λ ¬ κΈ°λŠ₯을 μ œκ³΅ν•΄μ•Ό ν•œλ‹€.
    - κΈ°λ³Έ, 인기순: μ’‹μ•„μš” 수 κΈ°μ€€ (동점 μ‹œ 등둝 μ‹œκ°„ μ—­μˆœ)
    - μ΅œμ‹ μˆœ: λ“±λ‘μ‹œκ°„ κΈ°μ€€, κ°€κ²©μˆœ(μ˜€λ¦„,λ‚΄λ¦Ό)

μ΄λ ‡κ²Œ λͺ…μ‹œν•˜λ©΄ κ΅¬ν˜„ μ‹œ μ •λ ¬ 쿼리가 더 λͺ…ν™•ν•΄μ§‘λ‹ˆλ‹€.
[/suggest_optional_refactor]


77-82: 할인 가격 계산 μš”κ΅¬μ‚¬ν•­μ˜ ꡬ체성 λΆ€μ‘±.

77-82ν–‰μ—μ„œ "쑰회 μ‹œ 할인 적용 가격을 κ³„μ‚°ν•˜μ—¬ ν‘œμ‹œ"라고 λͺ…μ‹œλ˜μ–΄ μžˆμ§€λ§Œ:

  • 할인 λ°μ΄ν„°μ˜ 좜처: DB에 μ €μž₯? μ™ΈλΆ€ μ‹œμŠ€ν…œ?
  • 할인 μš°μ„ μˆœμœ„: μ—¬λŸ¬ 할인이 μžˆμ„ λ•Œ 쀑볡 적용 μ—¬λΆ€?
  • ν‘œμ‹œ 방식: 원가/할인가 λͺ¨λ‘? ν• μΈμœ¨?
- 쑰회 μ‹œ 할인 적용 가격을 κ³„μ‚°ν•˜μ—¬ ν‘œμ‹œ.
  - 할인은 μƒν’ˆλ³„ λ˜λŠ” μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ 관리됨을 κ°€μ •
  - API 응닡에 포함 ν•­λͺ©: 원가(price), 할인가(discountedPrice), ν• μΈμœ¨(discountRate)
  - 각 μƒν’ˆ μ΅œλŒ€ 1개 ν• μΈλ§Œ 적용 (μš°μ„ μˆœμœ„: μƒν’ˆ > μΉ΄ν…Œκ³ λ¦¬)

μ΄λ ‡κ²Œ κ΅¬μ²΄ν™”ν•˜λ©΄ ERD/API 섀계 μ‹œ 할인 μ—”ν‹°ν‹° ꡬ쑰가 더 λͺ…ν™•ν•΄μ§‘λ‹ˆλ‹€.
[/suggest_optional_refactor]

docs/week02.md (3)

113-160: μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨ μ˜ˆμ œμ—μ„œ νŠΈλžœμž­μ…˜/λ™μ‹œμ„± 처리 λˆ„λ½.

ν˜„μž¬ 제곡된 예제(131-153ν–‰)λŠ” μ’‹μ•„μš” ν† κΈ€μ˜ "ν–‰λ³΅ν•œ 경둜(happy path)"만 λ³΄μ—¬μ€λ‹ˆλ‹€. ν•™μŠ΅μžκ°€ 싀무적 고민을 ν•˜λ„λ‘ λ‹€μŒμ„ μΆ”κ°€ν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€:

예제 λ‹€μŒμ— λ‹€μŒκ³Ό 같은 주석을 μΆ”κ°€ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€:

### πŸ’¬ Mermaid 예제 (계속)

**주의: μœ„ μ˜ˆμ œλŠ” λ‹¨μˆœ νλ¦„λ§Œ λ³΄μ—¬μ€λ‹ˆλ‹€**

μ‹€μ œ κ΅¬ν˜„ μ‹œ 고렀사항:
- **λ©±λ“±μ„±**: λ„€νŠΈμ›Œν¬ μž¬μ‹œλ„λ‘œ 인해 toggleLike()κ°€ μ—¬λŸ¬ 번 호좜될 수 있음 β†’ exists() 체크 ν•„μˆ˜
- **νŠΈλžœμž­μ…˜**: μ’‹μ•„μš” 수 μ—…λ°μ΄νŠΈμ™€ μ’‹μ•„μš” λ ˆμ½”λ“œ 생성/μ‚­μ œκ°€ μ›μžμ μ΄μ–΄μ•Ό 함
- **λ™μ‹œμ„±**: 같은 μ‚¬μš©μžκ°€ rapid-fire둜 μš”μ²­ μ‹œ κ²½ν•© 쑰건(race condition) κ°€λŠ₯μ„±

μ΄λ ‡κ²Œ ν•˜λ©΄ ν•™μŠ΅μžλ“€μ΄ 섀계 β†’ κ΅¬ν˜„μœΌλ‘œ λ„˜μ–΄κ°ˆ λ•Œ "μ™œ νŠΈλžœμž­μ…˜μ΄ ν•„μš”ν•œκ°€?", "μ™œ select for updateκ°€ ν•„μš”ν•œκ°€?"λΌλŠ” 질문이 μžμ—°μŠ€λŸ½κ²Œ μƒκΉλ‹ˆλ‹€.

[/suggest_recommended_refactor]


163-213: 클래슀 λ‹€μ΄μ–΄κ·Έλž¨ 예제의 도메인 μ±…μž„ 뢄석이 피상적.

ν˜„μž¬ 예제(183-206ν–‰)λŠ” ꡬ쑰만 보여주고, 각 도메인 객체의 μ±…μž„μ΄ λͺ…ν™•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예제 λ‹€μŒμ— μ„€λͺ…을 μΆ”κ°€ν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€:

### πŸ’¬ 예제 뢄석

**각 클래슀의 μ±…μž„ (도메인 주도 섀계)**:
- `Product`: μƒν’ˆμ˜ κΈ°λ³Έ 정보, 가격 계산 (원가 vs 할인가)
- `Brand`: λΈŒλžœλ“œ 정보 관리
- `Like`: μ‚¬μš©μž-μƒν’ˆ κ΄€κ³„μ˜ ꡬ체화 (aggregate λ˜λŠ” value object?)
- `Member`: μ‚¬μš©μž 정보 (μ’‹μ•„μš” κ΄€λ¦¬λŠ” μ—¬κΈ°? Like μ—”ν‹°ν‹°?에 μœ„μž„?)

**섀계 고민거리**:
1. LikeλŠ” 엔티티인가 VO인가? 
   - μ—”ν‹°ν‹°: ID ν•„λ“œ ν•„μš”, 생λͺ…μ£ΌκΈ° 독립적 β†’ CompositeKey(memberId, productId)
   - VO: Member와 Product의 μˆœμˆ˜ν•œ κ΄€κ³„λ§Œ ν‘œν˜„
   
2. μ’‹μ•„μš” μˆ˜λŠ” Product에 λΉ„μ •κ·œν™”ν•  것인가? Like ν…Œμ΄λΈ”μ—μ„œ COUNTν•  것인가?
   - μž₯점/단점 νŠΈλ ˆμ΄λ“œμ˜€ν”„ μ„€λͺ… ν•„μš”

μ΄λ ‡κ²Œ ν•˜λ©΄ "μ™œ μ΄λ ‡κ²Œ μ„€κ³„ν–ˆλŠ”κ°€?"λΌλŠ” 질문이 μžμ—°μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

[/suggest_recommended_refactor]


216-267: ERD μ˜ˆμ œμ—μ„œ λ™μ‹œμ„± μ œμ–΄λ₯Ό μœ„ν•œ 컬럼 λˆ„λ½.

μ£Όλ¬Έ/재고 κ΄€λ ¨ ERD이 μ—†λŠ”λ°, ν•™μŠ΅μžλ“€μ΄ race condition을 κ³ λ €ν•œ 섀계λ₯Ό ν•˜λ„λ‘ 돕기 μœ„ν•΄ λ‹€μŒμ„ μ œμ•ˆν•©λ‹ˆλ‹€.

"### ⚠ 자주 κ²ͺλŠ” μ‹€μˆ˜" μ„Ήμ…˜(262-267ν–‰)에 λ‹€μŒμ„ μΆ”κ°€ν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€:

### ⚠ 자주 κ²ͺλŠ” μ‹€μˆ˜

- λΉ„μ¦ˆλ‹ˆμŠ€ 흐름이 λ°˜μ˜λ˜μ§€ μ•Šμ€ μ •κ·œν™”λ§Œ 좔ꡬ
- 쀑볡 데이터 제거만 집쀑해 쑰회 JOIN이 과도해짐
- μƒνƒœ 컬럼 μ—†μŒ β†’ μ½”λ“œμ—μ„œ ν•˜λ“œμ½”λ”©μœΌλ‘œ 해결함

**+μΆ”κ°€: λ™μ‹œμ„±μ„ κ³ λ €ν•˜μ§€ μ•Šμ€ ERD**
- ❌ Stock ν…Œμ΄λΈ”λ§Œ 있고 pessimistic lockμ΄λ‚˜ version 컬럼 κ³ λ € μ•ˆ 함
- ❌ Order μƒνƒœ 전이(PENDING β†’ CONFIRMED)의 μ›μžμ„± 보μž₯ 방법 μ—†μŒ
- βœ… νŠΈλžœμž­μ…˜ 격리와 pessimistic lock (FOR UPDATE) λ˜λŠ” 버전 관리 ν•„μš”

**μ˜ˆμ‹œ: μ•ˆμ „ν•œ 재고 차감 쿼리**
```sql
-- Race condition λ°©μ§€: select for update + atomic decrement
SELECT * FROM products WHERE id = 1 FOR UPDATE;
UPDATE products SET stock = stock - 1 WHERE id = 1 AND stock > 0;
-- κ²°κ³Ό: 0 rows affectedλ©΄ ν’ˆμ ˆ 처리

이λ₯Ό 톡해 ERD 섀계 ν›„ κ΅¬ν˜„ μ‹œ `@Lock(LockModeType.PESSIMISTIC_WRITE)` 같은 JPA μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ™œ ν•„μš”ν•œμ§€ μžμ—°μŠ€λŸ½κ²Œ μ΄ν•΄ν•˜κ²Œ λ©λ‹ˆλ‹€.

[/suggest_recommended_refactor]

</blockquote></details>
<details>
<summary>docs/week02_quests.md (5)</summary><blockquote>

`19-32`: **섀계 λ²”μœ„μ—μ„œ λ©±λ“± λ™μž‘κ³Ό μ™ΈλΆ€ μ‹œμŠ€ν…œ μ—°λ™μ˜ ꡬ체성 λΆ€μ‘±.**

19-26ν–‰μ—μ„œ "λ©±λ“± λ™μž‘ 지원"κ³Ό "μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동"이 λͺ…μ‹œλ˜μ–΄ μžˆμ§€λ§Œ, ν•™μŠ΅μžκ°€ "이게 뭘 μ˜λ―Έν•˜λŠ” κ±°μ§€?"라고 물을 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.



```markdown
### πŸ“‹ 과제 정보

- **섀계 λ²”μœ„**
    - μƒν’ˆ λͺ©λ‘ / μƒν’ˆ 상세 / λΈŒλžœλ“œ 쑰회
    - μƒν’ˆ μ’‹μ•„μš” 등둝/μ·¨μ†Œ (λ©±λ“± λ™μž‘):
      * 같은 μ‚¬μš©μžκ°€ λ™μΌν•œ μ’‹μ•„μš” μš”μ²­μ„ μ—¬λŸ¬ 번 보내도 μ΅œμ’… μƒνƒœλŠ” 동일
      * 예: 첫 μš”μ²­ β†’ μ’‹μ•„μš” 등둝, μž¬μ „μ†‘ β†’ μƒνƒœ λ³€ν™” μ—†μŒ
    - μ£Όλ¬Έ 생성 및 결제 흐름:
      * 재고 차감 (λ™μ‹œ μš”μ²­ μ‹œ 초과 판맀 λ°©μ§€)
      * 포인트 차감
      * μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동 (예: 결제 κ²Œμ΄νŠΈμ›¨μ΄, 재고 관리 μ‹œμŠ€ν…œ)
      * νŠΈλžœμž­μ…˜ λ‘€λ°± (재고/포인트 볡ꡬ)

[/suggest_recommended_refactor]

μ΄λ ‡κ²Œ ν•˜λ©΄ ν•™μŠ΅μžλ“€μ΄ 섀계 μ‹œ λ©±λ“±μ„±κ³Ό λΆ„μ‚° νŠΈλžœμž­μ…˜μ„ μžμ—°μŠ€λŸ½κ²Œ κ³ λ €ν•˜κ²Œ λ©λ‹ˆλ‹€.


96-101: Feature Suggestions에 λ™μ‹œμ„±(Race Condition) ν•­λͺ© μΆ”κ°€ μ œμ•ˆ.

ν˜„μž¬ μ œμ•ˆ(96-101ν–‰)μ—μ„œ λ©±λ“±μ„±, 도메인 뢄리, ERD 고민은 μžˆμ§€λ§Œ, 싀무 e-commerce의 κ°€μž₯ ν”ν•œ 버그인 λ™μ‹œμ„± μ œμ–΄ 고민이 λΉ μ Έ μžˆμŠ΅λ‹ˆλ‹€.

### 🎯 Feature Suggestions

- μ’‹μ•„μš” κΈ°λŠ₯의 멱등성을 보μž₯ν•˜κΈ° μœ„ν•΄ μ–΄λ–»κ²Œ 섀계할 수 μžˆμ„κΉŒ?
- μ£Όλ¬Έ 생성 μ‹œ 재고/포인트 차감을 μ–΄λ–»κ²Œ μ—°κ²°ν–ˆλŠ”κ°€?
  * **μΆ”κ°€: 두 μ‚¬μš©μžκ°€ λ™μ‹œμ— λ§ˆμ§€λ§‰ 재고 μƒν’ˆμ„ ꡬ맀 μ‹œλ„ν•  λ•Œ μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒ?**
    - 재고 확인과 차감이 μ›μžμ μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄μ•Ό ν•˜λŠ” μ΄μœ λŠ”?
    - Pessimistic vs Optimistic locking의 μž₯단점?
- 도메인 객체λ₯Ό μ–΄λ–»κ²Œ λ‚˜λˆ„κ³  μ±…μž„μ„ μœ„μž„ν–ˆλŠ”κ°€?
- ERD 섀계 μ‹œ μ–΄λ–€ λΆ€λΆ„μ—μ„œ 고민이 μžˆμ—ˆλŠ”κ°€?
  * **μΆ”κ°€: νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€(Isolation Level)κ³Ό ERD의 κ΄€κ³„λŠ”?**

[/suggest_recommended_refactor]

μ΄λ ‡κ²Œ ν•˜λ©΄ ν•™μŠ΅μžλ“€μ΄ λ‹¨μˆœ "μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„"을 λ„˜μ–΄ "μ™œ 이런 λ¬Έμ œκ°€ λ°œμƒν•˜λŠ”κ°€?", "μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λŠ”κ°€?"λ₯Ό 깊이 있게 κ³ λ―Όν•˜κ²Œ λ©λ‹ˆλ‹€.


42-48: 체크리슀트 ν•­λͺ© 46번의 μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨ μ§€ν‘œκ°€ λͺ¨ν˜Έ.

"μ±…μž„ 객체가 λ“œλŸ¬λ‚˜λŠ”κ°€?"λΌλŠ” ν‘œν˜„μ΄ ꡬ체적이지 μ•Šμ•„, ν•™μŠ΅μžκ°€ μ–΄λ–€ μˆ˜μ€€μ˜ μ±…μž„ λΆ„λ°°λ₯Ό κΈ°λŒ€ν•˜λŠ”μ§€ 뢈λͺ…ν™•ν•©λ‹ˆλ‹€.

## βœ… Checklist

- [ ]  μƒν’ˆ/λΈŒλžœλ“œ/μ’‹μ•„μš”/μ£Όλ¬Έ 도메인이 λͺ¨λ‘ ν¬ν•¨λ˜μ–΄ μžˆλŠ”κ°€?
- [ ]  κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­μ΄ μœ μ € μ€‘μ‹¬μœΌλ‘œ μ •λ¦¬λ˜μ–΄ μžˆλŠ”κ°€?
- [ ]  μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ μ±…μž„ 객체가 λ“œλŸ¬λ‚˜λŠ”κ°€?
    * (μ§€ν‘œ) Controller β†’ Service β†’ Repository / Domain이 λͺ…ν™•ν•œ μ—­ν•  뢄담을 ν•˜κ³  μžˆλŠ”κ°€?
    * (μ§€ν‘œ) 각 객체 κ°„ λ©”μ‹œμ§€ 흐름이 단방ν–₯인가, μ•„λ‹ˆλ©΄ λ³΅μž‘ν•˜κ²Œ μ–½ν˜€ μžˆλŠ”κ°€?
- [ ]  클래슀 ꡬ쑰가 도메인 섀계λ₯Ό 잘 ν‘œν˜„ν•˜κ³  μžˆλŠ”κ°€?
- [ ]  ERD 섀계 μ‹œ 데이터 정합성을 κ³ λ €ν•˜μ—¬ κ΅¬μ„±ν•˜μ˜€λŠ”κ°€?
    * (μ§€ν‘œ) Foreign key, μ œμ•½(constraints), νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ΄ λͺ…μ‹œλ˜μ–΄ μžˆλŠ”κ°€?

[/suggest_recommended_refactor]


63-95: 기술 λΌμ΄νŒ… κ°€μ΄λ“œμ˜ 성곡 사둀 λΆ€μž¬.

"쒋은 톀" μ„Ήμ…˜(77-87ν–‰)은 μ˜ˆμ‹œλ§Œ 있고, μ‹€μ œ 과제 λ²”μœ„μ—μ„œ μ–΄λ–€ λ‚΄μš©μ„ 써야 ν•˜λŠ”μ§€ ꡬ체적인 μ˜ˆκ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ˜ˆμ‹œλ₯Ό μΆ”κ°€ν•˜λ©΄ ν•™μŠ΅μžκ°€ 더 ꡬ체적으둜 따라할 수 μžˆμŠ΅λ‹ˆλ‹€:

### ✨ 쒋은 톀은 이런 λŠλ‚Œμ΄μ—μš” (Round 2 μ˜ˆμ‹œ)

| νŠΉμ§• | Round 2 섀계 μ˜ˆμ‹œ |
| --- | --- |
| πŸ€” λ‚΄ μ–Έμ–΄λ‘œ μ„€λͺ…ν•œ κ°œλ… | "Like κΈ°λŠ₯을 μ²˜μŒμ—” κ°„λ‹¨ν•œ toggle둜 κ΅¬ν˜„ν–ˆλŠ”λ°, 멱등성이 보μž₯λ˜μ§€ μ•Šμ•„ μž¬μ„€κ³„ν–ˆλ‹€" |
| πŸ’­ νŒλ‹¨ 흐름이 λ“œλŸ¬λ‚˜λŠ” κΈ€ | "μ£Όλ¬Έ μ‹œ 재고 확인과 차감을 λΆ„λ¦¬ν–ˆλ‹€κ°€, λ™μ‹œ ꡬ맀 μ‹œ 음수 μž¬κ³ κ°€ λ‚˜νƒ€λ‚˜λŠ” 문제λ₯Ό λ°œκ²¬ν•΄ νŠΈλžœμž­μ…˜μœΌλ‘œ κ°μ‹Έκ²Œ λ˜μ—ˆλ‹€" |
| πŸ“ 정보 λ‚˜μ—΄λ³΄λ‹€ μΈμ‚¬μ΄νŠΈ 쀑심 | "μ²˜μŒμ—” Like와 Productλ₯Ό 1:N으둜 μ—°κ²°ν–ˆλŠ”λ°, μ’‹μ•„μš” 수λ₯Ό λΉ λ₯΄κ²Œ μ‘°νšŒν•΄μ•Ό ν•΄μ„œ Product에 λΉ„μ •κ·œν™”ν•˜λŠ” trade-offλ₯Ό κ³ λ―Όν–ˆλ‹€" |

μ΄λ ‡κ²Œ ν•˜λ©΄ ν•™μŠ΅μžλ“€μ΄ "μ•„, λ‚΄ 섀계 고민도 μ΄λ ‡κ²Œ 써야 ν•˜λŠ”κ΅¬λ‚˜"라고 μ΄ν•΄ν•©λ‹ˆλ‹€.

[/suggest_optional_refactor]


1-10: PR 본문의 빈 ν…œν”Œλ¦Ώ 정보 제곡.

ν˜„μž¬ PR 본문이 빈 λ§ˆν¬λ‹€μš΄ ν…œν”Œλ¦Ώμ΄λΌλŠ” PR λͺ©ν‘œ μ„€λͺ…이 μžˆλŠ”λ°, ν•™μŠ΅μž κ°€μ΄λ“œμ—μ„œ PR 제좜 μ‹œ μ–΄λ–€ 정보λ₯Ό 포함할 것을 ꢌμž₯ν•˜λŠ”μ§€ λͺ…μ‹œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λ‹€μŒ κ°€μ΄λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€:

## πŸ“ Round 2 Quests

---

### πŸ“‹ PR μž‘μ„± κ°€μ΄λ“œ

> PR 제λͺ©: `[2μ£Όμ°¨] 섀계 λ¬Έμ„œ 제좜 - 홍길동`

> **PR 본문에 포함할 사항**:
> 1. **섀계 μ˜μ‚¬κ²°μ •** (각 1-2쀄)
>    - Like κΈ°λŠ₯의 멱등성을 μœ„ν•΄ μƒνƒœ 기반 ν† κΈ€ μ„ νƒν•œ 이유
>    - μ£Όλ¬Έ μ‹œ 재고 보호λ₯Ό μœ„ν•΄ μ„ νƒν•œ 락 μ „λž΅ (Pessimistic/Optimistic)
> 2. **κ³ λ―Όν•œ 지점**
>    - "이 뢀뢄이 μ–΄λ €μ› μŠ΅λ‹ˆλ‹€" λ˜λŠ” "μ—¬λŸ¬ 선택지가 μžˆμ—ˆμŠ΅λ‹ˆλ‹€"
> 3. **ν”Όλ“œλ°± 포인트**
>    - λ¦¬λ·°μ–΄μ—κ²Œ 특히 봐달라고 ν•˜λŠ” λΆ€λΆ„

μ΄λ ‡κ²Œ ν•˜λ©΄ 리뷰어(강사)κ°€ ν•™μŠ΅μžμ˜ 사고 과정을 μ΄ν•΄ν•˜κ³  ν”Όλ“œλ°±ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
[/suggest_optional_refactor]

</blockquote></details>

</blockquote></details>

<details>
<summary>πŸ“œ Review details</summary>

**Configuration used**: CodeRabbit UI

**Review profile**: CHILL

**Plan**: Pro

<details>
<summary>πŸ“₯ Commits</summary>

Reviewing files that changed from the base of the PR and between d5ec39748d141edbb4c1b43001d1f4ce2f6b0b4c and 52f798bfffd56cc5547efedbe95282e911023df1.

</details>

<details>
<summary>πŸ“’ Files selected for processing (3)</summary>

* `docs/week02.md` (1 hunks)
* `docs/week02_quests.md` (1 hunks)
* `docs/week2/01-requirements.md` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧠 Learnings (1)</summary>

<details>
<summary>πŸ““ Common learnings</summary>

Learnt from: minor7295
Repo: Loopers-dev-lab/loopers-spring-java-template PR: 22
File: apps/commerce-api/src/main/java/com/loopers/interfaces/api/point/PointsV1Controller.java:24-34
Timestamp: 2025-10-31T14:57:09.157Z
Learning: In the loopers-spring-java-template repository, the X-USER-ID header-based user identification is temporarily used for learning purposes and will be replaced with proper authentication (Spring Security) in a future PR. Do not flag this as a security issue until proper authentication is implemented.


</details>

</details>

</details>

<details>
<summary>πŸ”‡ Additional comments (1)</summary><blockquote>

<details>
<summary>docs/week02.md (1)</summary><blockquote>

`268-287`: **μ°Έκ³  자료 링크가 λͺ¨λ‘ μ΅œμ‹ μΈμ§€ 확인 ν•„μš”.**

μ°Έκ³  자료 μ„Ήμ…˜(275-280ν–‰)의 링크듀이 μ—¬μ „νžˆ μœ νš¨ν•œμ§€ ν™•μΈν•˜κ³ , 특히 도메인 주도 섀계(DDD) κ΄€λ ¨ ν•œκ΅­μ–΄ μžλ£Œκ°€ μΆ©λΆ„ν•œμ§€ κ²€ν† λ₯Ό μ œμ•ˆν•©λ‹ˆλ‹€.



λ‹€μŒ λ§ν¬λ“€μ˜ μœ νš¨μ„±μ„ 확인해 μ£Όμ„Έμš”:
- https://www.msaschool.io/operation/design/design-two/ (도메인 주도 섀계)
- https://mermaid.js.org/ (Mermaid 곡식 λ¬Έμ„œ)

λ˜ν•œ λ‹€μŒμ„ μΆ”κ°€ν•˜λ©΄ ν•™μŠ΅μžμ—κ²Œ 도움이 될 것 κ°™μŠ΅λ‹ˆλ‹€:
- ν•œκ΅­μ–΄ DDD μ„œμ /아티클 μΆ”μ²œ (λ²ˆμ—­λ³Έ λ˜λŠ” 원문)
- Mermaid ν•œκ΅­μ–΄ νŠœν† λ¦¬μ–Ό

[/request_verification]

</blockquote></details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

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