Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
3310a3d
fix : 예제 테스트 코드 오류 해결을 위한 testcontainers 버전 업
madirony Feb 3, 2026
2a442e0
Merge pull request #48 from madirony/pr-only-commit
madirony Feb 8, 2026
b29e77f
Merge branch 'Loopers-dev-lab:main' into feature/week1-user-tests
Namjin-kimm Feb 13, 2026
6680890
[docs] : 설계문서 작성 및 클로드 스킬 md 작성
Namjin-kimm Feb 13, 2026
988f22c
[refactor] : 사용자 로그인 인증 시, argumentResolver를 이용하여 커스텀 어노테이션 적용. 인터셉터에…
Namjin-kimm Feb 16, 2026
c06a7d4
[feat] : 관리자 인증 AdminInterceptor 구현
Namjin-kimm Feb 16, 2026
84e9793
[refactor] : PasswordEncoder 인터페이스 분리로 Spring Security 의존성 제거
Namjin-kimm Feb 16, 2026
fb95ce0
[docs] : claude.md 수정
Namjin-kimm Feb 16, 2026
8d6e9ab
[docs] : erd 내용 수정
Namjin-kimm Feb 16, 2026
dc01987
Merge pull request #1 from Namjin-kimm/volume-2
Namjin-kimm Feb 16, 2026
ceb53ac
[docs] : claude.md 업데이트
Namjin-kimm Feb 23, 2026
21fb058
[feat] : 브랜드 테스트 코드 작성 및 기능 구현
Namjin-kimm Feb 23, 2026
bd5d301
[docs] : 장바구니 도메인 제외
Namjin-kimm Feb 24, 2026
5ae3714
[docs] : claude.md 수정
Namjin-kimm Feb 24, 2026
fdb2216
[feat] : 상품 도메인 테스트 코드 작성 및 기능 구현
Namjin-kimm Feb 24, 2026
2c3d60f
[feat] : 상품 도메인 테스트 코드 수정 및 주석 작성
Namjin-kimm Feb 27, 2026
13669bd
[feat] : 좋아요 도메인 테스트 코드 작성 및 기능 구현
Namjin-kimm Feb 27, 2026
72c9cf2
[fix] : 고객에게 상품정보 반환 시, 재고 여부가 아닌 재고 수량 반환, 그리고 brandId는 반환하지 않고 bran…
Namjin-kimm Feb 27, 2026
dc8e289
[fix] : like 도메인에 사용하지 않는 메서드 제거 및 주석 작성
Namjin-kimm Feb 27, 2026
52a7e45
[feat] : 주문 도메인 테스트 코드 작성 및 기능 구현
Namjin-kimm Feb 27, 2026
ab7b9ec
[docs] : 주석 작성
Namjin-kimm Feb 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .claude/skills/requirement-analysis/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
name: requirements-analysis
description:
제공된 요구사항을 분석하고, 개발자와의 질문/대답을 통해 애매한 요구사항을 명확히 하여 정리합니다.
모든 정리가 끝나면, 시퀀스 다이어그램, 클래스 다이어그램, ERD 등을 Mermaid 문법으로 작성한다.
요구사항이 제공되었을 때, 코드를 작성하기 전 이를 명확히 하는 데에 사용합니다.
---
요구사항을 분석할 때 반드시 다음 흐름을 따른다.
### 1️⃣ 요구사항을 그대로 믿지 말고, 문제 상황으로 다시 설명한다.
- 요구사항 문장을 정리하는 데서 끝내지 않는다.
- "무엇을 만들까?"가 아니라 "지금 어떤 문제가 있고, 그걸 왜 해결하려는가?" 로 재해석한다.
- 다음 관점을 분리해서 정리한다:
- 사용자 관점
- 비즈니스 관점
- 시스템 관점
> 예시
> "주문 실패 시 결제를 취소한다" → "결제 성공/실패와 주문 상태가 어긋나지 않도록 일관성을 유지하려는 문제"
### 2️⃣ 애매한 요구사항을 숨기지 말고 드러낸다
- 추측하거나 알아서 결정하지 않는다.
- 요구사항에서 결정되지 않은 부분을 명시적으로 나열한다.
**다음 유형의 질문을 반드시 포함한다:**
- 정책 질문: 기준 시점, 성공/실패 조건, 예외 처리 규칙
- 경계 질문: 어디까지가 한 책임인가, 어디서 분리되는가
- 확장 질문: 나중에 바뀔 가능성이 있는가

### 3️⃣ 요구사항 명확화를 위한 질문을 개발자 답변이 쉬운 형태로 제시한다
- 질문은 우선순위를 가진다 (중요한 것부터).
- 선택지가 있는 경우, 옵션 + 영향도를 함께 제시한다.
> 형식 예시:
- 선택지 A: 하나의 트랜잭션으로 처리 → 구현 단순, 확장성 낮음
- 선택지 B: 단계별 분리 → 구조 복잡, 확장/보상 처리 유리

### 4️⃣ 합의된 내용을 바탕으로 개념 모델부터 잡는다
- 바로 코드나 기술 얘기로 들어가지 않는다.
- 먼저 다음을 정의한다:
- 액터 (사용자, 외부 시스템)
- 핵심 도메인
- 보조/외부 시스템
- 이 단계는 “구현”이 아니라 설계 사고 정렬이 목적이다.

### 5️⃣ 다이어그램은 항상 이유 → 다이어그램 → 해석 순서로 제시한다
**다이어그램을 그리기 전에 반드시 설명한다**
- 왜 이 다이어그램이 필요한지
- 이 다이어그램으로 무엇을 검증하려는지

**다이어그램은 Mermaid 문법으로 작성한다**
사용 기준:
- **시퀀스 다이어그램**
- 책임 분리
- 호출 순서
- 트랜잭션 경계 확인
- **클래스 다이어그램**
- 도메인 책임
- 의존 방향
- 응집도 확인
- **ERD**
- 영속성 구조
- 관계의 주인
- 정규화 여부

### 6️⃣ 다이어그램을 던지고 끝내지 말고 읽는 법을 짚어준다
- "이 구조에서 특히 봐야 할 포인트"를 2~3줄로 설명한다.
- 설계 의도가 드러나도록 해석을 붙인다.

### 7️⃣ 설계의 잠재 리스크를 반드시 언급한다
- 현재 설계가 가질 수 있는 위험을 숨기지 않는다.
- 트랜잭션 비대화
- 도메인 간 결합도 증가
- 정책 변경 시 영향 범위 확대
- 해결책은 정답처럼 말하지 않고 선택지로 제시한다.

### 톤 & 스타일 가이드
- 강의처럼 설명하지 말고 설계 리뷰 톤을 유지한다
- 정답이라고 제시하기보다, 다른 선택지가 있다면 이를 제공하도록 한다.
- 코드보다 의도, 책임, 경계를 더 중요하게 다룬다
- 구현 전에 생각해야 할 것을 끌어내는 데 집중한다
306 changes: 306 additions & 0 deletions .docs/design/01-requirements.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,306 @@
# 이커머스 요구사항 정의서

## 1. 목적 및 범위

### 1.1 목적

온라인 커머스 플랫폼을 구축한다.
고객은 브랜드별 상품을 탐색하고, 관심 상품에 좋아요를 표시하며, 주문을 통해 상품을 구매할 수 있다.
관리자는 브랜드와 상품을 등록/관리하고, 주문 현황을 조회할 수 있다.

### 1.2 시스템 사용자

| 사용자 유형 | 설명 |
|-------------------|------|
| **비회원 (Visitor)** | 회원가입 전 상태의 사용자. 공개 정보 조회만 가능하다 |
| **회원 (User)** | 회원가입을 완료한 사용자. 좋아요, 주문 등 인증이 필요한 기능을 사용한다 |
| **관리자 (Admin)** | 내부 운영자. 브랜드/상품 관리 및 주문 조회를 수행한다 |

### 1.3 범위

본 문서는 아래 도메인의 기능적 요구사항을 정의한다.

- **브랜드**: 조회(고객), 등록/수정/삭제(관리자)
- **상품**: 조회(고객), 등록/수정/삭제(관리자)
- **좋아요**: 상품에 대한 좋아요 등록/취소/목록 조회
- **주문**: 주문 생성, 주문 내역 조회

> 회원 도메인(가입, 인증, 내 정보 관리)은 이미 구현 완료되었으므로 본 문서의 범위에서 제외한다.
### 1.4 유비쿼터스 언어

본 프로젝트에서 사용하는 도메인 용어를 아래와 같이 정의한다.
모든 문서(요구사항, ERD, API 명세), 코드(클래스명, 변수명), 구두 커뮤니케이션에서 동일한 용어를 사용한다.

#### 사용자

| 한국어 | 영문 | 정의 |
|--------|-------|------|
| 회원 | User | 회원가입을 완료하여 인증된 상태로 서비스를 이용하는 사용자 |
| 관리자 | Admin | 내부 운영 권한을 가진 사용자. 브랜드/상품 관리, 주문 조회를 수행한다 |

#### 브랜드

| 한국어 | 영문 | 정의 |
|--------|------|------|
| 브랜드 | Brand | 상품을 제공하는 주체. 하나의 브랜드는 여러 상품을 가질 수 있다 |
| 브랜드명 | Brand Name | 브랜드를 식별하는 이름 |

#### 상품

| 한국어 | 영문 | 정의 |
|--------|------|------|
| 상품 | Product | 고객이 구매할 수 있는 판매 단위 |
| 상품명 | Product Name | 상품을 식별하는 이름 |
| 가격 | Price | 상품 1개의 판매 금액 |
| 재고 | Stock | 현재 판매 가능한 상품의 수량 |

#### 좋아요

| 한국어 | 영문 | 정의 |
|--------|------|------|
| 좋아요 | Like | 회원이 특정 상품에 대해 관심을 표시하는 행위. 회원당 상품당 하나만 존재한다 |

#### 주문

| 한국어 | 영문 | 정의 |
|--------|------|------|
| 주문 | Order | 회원이 하나 이상의 상품을 구매하기 위해 생성하는 거래 단위 |
| 주문 항목 | Order Item | 주문에 포함된 개별 상품과 그 수량. 주문 시점의 상품 정보를 스냅샷으로 보존한다 |
| 수량 | Quantity | 주문 항목에서 해당 상품을 구매하는 개수 |
| 스냅샷 | Snapshot | 주문 시점의 상품 정보(상품명, 가격, 브랜드 등) 사본. 원본이 변경되어도 주문 기록은 유지된다 |

> **용어 사용 원칙**: "아이템"이 아닌 "상품", "취소"가 아닌 "좋아요 취소"처럼, 위 표에 정의된 용어만을 사용한다. 새로운 용어가 필요한 경우 본 표에 먼저 추가한 후 사용한다.
---

## 2. 유저 시나리오

### 2.1 브랜드 (Brand)

#### US-B01: 브랜드 정보 조회 (고객)

> 고객(비회원/회원)은 특정 브랜드의 정보를 조회할 수 있다.
#### US-B02: 브랜드 목록 조회 (관리자)

> 관리자는 등록된 브랜드 목록을 조회할 수 있다.
- 관리에 필요한 상세 정보를 확인할 수 있다.

#### US-B03: 브랜드 상세 조회 (관리자)

> 관리자는 특정 브랜드의 상세 정보를 조회할 수 있다.
#### US-B04: 브랜드 등록 (관리자)

> 관리자는 새로운 브랜드를 등록할 수 있다.
#### US-B05: 브랜드 정보 수정 (관리자)

> 관리자는 기존 브랜드의 정보를 수정할 수 있다.
#### US-B06: 브랜드 삭제 (관리자)

> 관리자는 브랜드를 삭제할 수 있다.
- 브랜드 삭제 시, 해당 브랜드에 속한 모든 상품도 함께 삭제된다.

---

### 2.2 상품 (Product)

#### US-P01: 상품 목록 조회 (고객)

> 고객(비회원/회원)은 상품 목록을 탐색할 수 있다.
- 특정 브랜드의 상품만 필터링하여 볼 수 있다.
- 정렬 기준을 선택할 수 있다 (최신순은 필수, 가격순/좋아요순은 선택).
- 페이지 단위로 조회한다.

#### US-P02: 상품 상세 조회 (고객)

> 고객(비회원/회원)은 특정 상품의 상세 정보를 조회할 수 있다.
#### US-P03: 상품 목록 조회 (관리자)

> 관리자는 등록된 상품 목록을 조회할 수 있다.
- 브랜드별로 필터링하여 조회할 수 있다.
- 관리에 필요한 상세 정보를 확인할 수 있다.

#### US-P04: 상품 상세 조회 (관리자)

> 관리자는 특정 상품의 상세 정보를 조회할 수 있다.
#### US-P05: 상품 등록 (관리자)

> 관리자는 새로운 상품을 등록할 수 있다.
- 상품은 반드시 이미 등록된 브랜드에 속해야 한다.

#### US-P06: 상품 정보 수정 (관리자)

> 관리자는 기존 상품의 정보를 수정할 수 있다.
- 단, 상품의 소속 브랜드는 변경할 수 없다.

#### US-P07: 상품 삭제 (관리자)

> 관리자는 상품을 삭제할 수 있다.
---

### 2.3 좋아요 (Like)

#### US-L01: 상품 좋아요 등록

> 회원은 관심 있는 상품에 좋아요를 등록할 수 있다.
#### US-L02: 상품 좋아요 취소

> 회원은 이전에 등록한 좋아요가 있다면, 한 번 더 클릭하여 좋아요를 취소할 수 있다.
#### US-L03: 좋아요한 상품 목록 조회

> 회원은 자신이 좋아요를 등록한 상품 목록을 조회할 수 있다.
---

### 2.4 주문 (Order)

#### US-O01: 주문 생성

> 회원은 하나 이상의 상품을 선택하고 수량을 지정하여 주문할 수 있다.
- 주문 시점의 상품 정보가 주문에 스냅샷으로 보존된다.
- 주문이 완료되면, 해당 수량만큼 상품 재고가 차감된다.

#### US-O02: 주문 목록 조회 (회원)

> 회원은 자신의 주문 내역을 기간을 지정하여 조회할 수 있다.
- 조회 시작일과 종료일을 지정한다.

#### US-O03: 주문 상세 조회 (회원)

> 회원은 자신의 특정 주문의 상세 내역을 조회할 수 있다.
- 주문 당시의 브랜드,상품 정보를 확인할 수 있다.

#### US-O04: 주문 목록 조회 (관리자)

> 관리자는 전체 주문 목록을 페이지 단위로 조회할 수 있다.
#### US-O05: 주문 상세 조회 (관리자)

> 관리자는 특정 주문의 상세 내역을 조회할 수 있다.
---

## 3. 비즈니스 규칙

### 3.1 인증 및 권한

| 규칙 ID | 규칙 | 비고 |
|---------|------|------|
| BR-A01 | 회원 전용 기능은 인증된 사용자만 접근할 수 있다 | 좋아요, 주문 등 |
| BR-A02 | 관리자 전용 기능은 관리자 인증을 통과한 사용자만 접근할 수 있다 | 브랜드/상품 관리, 주문 관리 |
| BR-A03 | 공개 기능(상품 조회, 브랜드 조회)은 인증 없이 접근할 수 있다 | |

### 3.2 브랜드

| 규칙 ID | 규칙 | 비고 |
|---------|------|------|
| BR-B01 | 브랜드를 삭제하면, 해당 브랜드에 속한 모든 상품도 함께 삭제된다 | 연쇄 삭제 |
| BR-B02 | 고객에게 제공되는 브랜드 정보와 관리자에게 제공되는 브랜드 정보는 다를 수 있다 | 노출 범위 구분 |

### 3.3 상품

| 규칙 ID | 규칙 | 비고 |
|---------|------|-------------------------------------------------------|
| BR-P01 | 상품은 반드시 이미 등록된 브랜드에 속해야 한다 | 등록 시 검증 |
| BR-P02 | 상품의 소속 브랜드는 등록 이후 변경할 수 없다 | 불변 속성 |
| BR-P03 | 상품 목록은 최신순 정렬을 기본으로 제공한다 | 필수 정렬 |
| BR-P04 | 가격순, 좋아요순 정렬은 선택적으로 제공할 수 있다 | 선택 구현 |
| BR-P05 | 고객에게 제공되는 상품 정보와 관리자에게 제공되는 상품 정보는 다를 수 있다 | 노출 범위 구분 (예: 회원 및 비회원은 재고 여부만 확인, 관리자는 재고 수량까지 확인 가능) |

### 3.4 좋아요

| 규칙 ID | 규칙 | 비고 |
|---------|------|------|
| BR-L01 | 한 회원은 동일 상품에 좋아요를 한 번만 등록할 수 있다 | 중복 방지 |
| BR-L02 | 좋아요를 등록하지 않은 상품에 대해 취소할 수 없다 | |
| BR-L03 | 회원은 자신의 좋아요 목록만 조회할 수 있다 | |

### 3.5 주문

| 규칙 ID | 규칙 | 비고 |
|---------|------|------|
| BR-O01 | 주문은 하나 이상의 상품 항목을 포함해야 한다 | |
| BR-O02 | 각 상품 항목의 수량은 1 이상이어야 한다 | |
| BR-O03 | 주문 시점에 상품 재고가 충분해야 한다 | 재고 부족 시 주문 실패 |
| BR-O04 | 주문이 성공하면, 주문한 수량만큼 상품 재고가 차감된다 | |
| BR-O05 | 주문에는 당시 상품 정보가 스냅샷으로 보존된다 | 이후 상품 정보가 변경되어도 주문 기록은 유지 |
| BR-O06 | 회원은 자신의 주문만 조회할 수 있다 | |
| BR-O07 | 관리자는 전체 주문을 조회할 수 있다 | |
| BR-O08 | 주문 목록 조회 시, 기간(시작일~종료일)을 지정하여 필터링한다 | 회원 조회 시 |

---

## 4. 예외 및 정책

### 4.1 공통

| 예외 상황 | 정책 |
|-----------|------|
| 인증되지 않은 사용자가 인증 필요 기능에 접근 | 접근을 거부하고, 인증 필요 사유를 안내한다 |
| 관리자 인증 없이 관리자 기능에 접근 | 접근을 거부한다 |

### 4.2 브랜드

| 예외 상황 | 정책 |
|-----------|------|
| 존재하지 않는 브랜드 조회/수정/삭제 시도 | 요청을 거부하고, 존재하지 않음을 안내한다 |

### 4.3 상품

| 예외 상황 | 정책 |
|-----------|------|
| 존재하지 않는 브랜드에 상품 등록 시도 | 등록을 거부하고, 브랜드가 존재하지 않음을 안내한다 |
| 상품의 소속 브랜드 변경 시도 | 수정을 거부한다 |
| 존재하지 않는 상품 조회/수정/삭제 시도 | 요청을 거부하고, 존재하지 않음을 안내한다 |

### 4.4 좋아요

| 예외 상황 | 정책 |
|-----------|------|
| 이미 좋아요한 상품에 다시 좋아요 시도 | 등록을 거부하고, 이미 좋아요 상태임을 안내한다 |
| 좋아요하지 않은 상품에 좋아요 취소 시도 | 취소를 거부하고, 좋아요 상태가 아님을 안내한다 |
| 존재하지 않는 상품에 좋아요 시도 | 등록을 거부한다 |

### 4.5 주문

| 예외 상황 | 정책 |
|-----------|------|
| 주문 상품의 재고가 부족한 경우 | 주문을 거부하고, 재고 부족 사유를 안내한다 |
| 존재하지 않는 상품을 주문에 포함한 경우 | 주문을 거부한다 |
| 주문 항목이 비어있는 경우 | 주문을 거부한다 |
| 수량이 0 이하인 항목이 포함된 경우 | 주문을 거부한다 |
| 다른 회원의 주문을 조회하려는 경우 | 접근을 거부한다 |

---

## 5. 이번 범위에서 제외하는 것들

| 항목 | 사유 |
|------|------|
| **회원 도메인** | 이미 구현 완료 (가입, 인증, 내 정보 관리, 비밀번호 변경) |
| **결제** | 추후 별도 단계에서 개발 예정 |
| **주문 취소/환불** | 결제 기능과 연계하여 추후 개발 |
| **주문 상태 관리** (배송 중, 배송 완료 등) | 현재 범위에서는 주문 생성과 조회만 다룬다 |
| **상품 이미지 관리** | 파일 업로드/스토리지는 현재 범위에 포함하지 않는다 |
| **상품 카테고리** | 현재는 브랜드 단위로만 상품을 분류한다 |
| **검색 (키워드 기반 상품 검색)** | 현재는 브랜드 필터링과 정렬만 제공한다 |
| **회원 탈퇴** | 현재 범위에 포함하지 않는다 |
| **관리자 등록/관리** | 관리자 계정 관리는 현재 범위에 포함하지 않는다 |
Loading