Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
d73dd42
refactor: 패스워드 형식 검증 위치 VO 생성자로 변경
plan11plan Feb 9, 2026
585d382
refactor: Password→EncryptedPassword 리팩토링 및 서비스 계층 Command/Info DTO 도입
plan11plan Feb 9, 2026
df15ab8
chore: example 예제 제거
plan11plan Feb 9, 2026
8d4b6d2
refactor: 생년월일-비밀번호 교차 검증을 UserModel 생성자로 이동
plan11plan Feb 9, 2026
32f687c
docs: 기능 요구 사항 및 유비쿼터스 언어 정의
plan11plan Feb 11, 2026
99a3bc4
docs: 좋아요 기능 목록 수정
plan11plan Feb 13, 2026
2ff98b3
docs: 시퀀스,클래스 다이어그램 및 erd 추가
plan11plan Feb 13, 2026
e353777
docs: 기능요구사항,클래스다이어그램,erd 수정
plan11plan Feb 15, 2026
32c3e60
docs: 프로젝트 컨벤션 claude-skill 추가
plan11plan Feb 18, 2026
e32892e
refactor: 예외처리 구조를 ErrorCode 인터페이스 기반으로 마이그레이션
plan11plan Feb 18, 2026
53b69d6
test: 예외처리 마이그레이션에 따른 테스트 코드 수정
plan11plan Feb 18, 2026
339a8a0
chore: Gradle Java Home을 JDK 21로 고정
plan11plan Feb 18, 2026
25fca33
refactor: User 도메인 패키지 구조를 서브패키지로 재구성
plan11plan Feb 18, 2026
92a0395
feat: Application 계층 추가 및 VO 컨벤션 적용
plan11plan Feb 18, 2026
7aaf5cb
refactor: Interfaces 계층 패키지 재구성 및 Facade 의존으로 변경
plan11plan Feb 18, 2026
a78fd8b
test: 테스트 코드 패키지 이동 및 VO 컨벤션 적용
plan11plan Feb 18, 2026
f7cc532
docs: DTO 컨벤션에 VO 전달 규칙 명시
plan11plan Feb 18, 2026
79e75a0
feat: Filter + ArgumentResolver 기반 인증 구조 구현
plan11plan Feb 18, 2026
697346d
refactor: Controller/Facade에서 인증 관심사 분리
plan11plan Feb 18, 2026
0264b0d
test: AuthFilter, AuthUserArgumentResolver 단위 테스트 추가
plan11plan Feb 18, 2026
1395ed8
refactor: @Auth/AuthUser를 @Login/LoginUser로 네이밍 변경
plan11plan Feb 18, 2026
09a9522
docs: 예외처리 컨벤션 Skill 업데이트
plan11plan Feb 19, 2026
d7ad2c1
docs: 딥다이브 인터뷰 Skill 추가
plan11plan Feb 19, 2026
743c870
feat: Brand 도메인 엔티티, 서비스, 리포지토리 구현
plan11plan Feb 20, 2026
569112b
test: Brand 도메인 단위 테스트 추가
plan11plan Feb 20, 2026
88b5a7c
docs: 프로젝트 컨벤션 업데이트 (Entity 생성자, Service 반환 타입, Soft Delete 규칙)
plan11plan Feb 20, 2026
c9846ef
feat: Brand Application 레이어 구현 (Facade + DTO)
plan11plan Feb 20, 2026
6eb7ffb
test: BrandFacade 단위 테스트 추가
plan11plan Feb 20, 2026
c30081c
feat: Brand Admin LDAP 인증 필터 구현
plan11plan Feb 20, 2026
7d051fc
feat: Brand 도메인/인프라에 페이지네이션 조회 기능 추가
plan11plan Feb 20, 2026
09c6310
feat: Brand Admin API 컨트롤러 구현 및 Public API GET 전용으로 변경
plan11plan Feb 20, 2026
9b49ad9
test: Brand Admin API E2E 테스트 추가 및 기존 테스트 수정
plan11plan Feb 20, 2026
828091d
chore: Brand API .http 테스트 파일 추가
plan11plan Feb 20, 2026
6785a7f
feat: 상품 도메인 엔티티, VO, 서비스, 리포지토리 구현
plan11plan Feb 21, 2026
aeba061
feat: 상품 Admin CRUD API 구현
plan11plan Feb 21, 2026
8baa37c
feat: 상품 Public 조회 API 구현
plan11plan Feb 21, 2026
a0dc1bc
feat: 브랜드 삭제 시 상품 연쇄 soft delete 추가
plan11plan Feb 21, 2026
a086324
test: 상품 도메인 단위 테스트 및 E2E 테스트 추가
plan11plan Feb 21, 2026
2f79488
docs: 리드미 초기화
plan11plan Feb 21, 2026
ab93916
docs: 도메인별 설계 문서 재구성 및 CLAUDE.md 설계 참조 규칙 추가
plan11plan Feb 21, 2026
14f8532
docs: TDD 스킬 추가
plan11plan Feb 21, 2026
a5e59ea
chore: ArchUnit 의존성 및 Command Hook 설정 추가
plan11plan Feb 22, 2026
289ca88
test: ArchUnit 아키텍처 컨벤션 테스트 추가
plan11plan Feb 22, 2026
46afd3a
docs: 컨벤션 스킬에 domain Service 허용 사항 반영
plan11plan Feb 22, 2026
d55dabd
docs: TDD 스킬에 Solo/Pair 모드 선택 추가
plan11plan Feb 23, 2026
8e1111c
feat: ProductLikeModel 엔티티 및 도메인 테스트 구현
plan11plan Feb 23, 2026
4f128b6
feat: ProductLikeService 좋아요 토글 및 목록 조회 구현
plan11plan Feb 23, 2026
4adf99e
test: ProductLikeService 좋아요 토글 및 목록 조회 테스트 추가
plan11plan Feb 23, 2026
96b281a
docs: DTO 네이밍 컨벤션 변경 (Application: Criteria/Result, Domain: Command)
plan11plan Feb 23, 2026
4a271ac
refactor: Facade/Service 메서드명을 도메인 의미가 드러나도록 개선
plan11plan Feb 23, 2026
cefde3c
fix: UserRepository soft delete 필터링 누락 버그 수정
plan11plan Feb 23, 2026
9185b91
feat: 상품 존재 확인 메서드 및 NOT_FOUND_DATA 에러타입 추가
plan11plan Feb 23, 2026
0ab85d7
refactor: DTO 컨벤션 네이밍 적용 (Command→domain, Info→Result, Criteria 추가)
plan11plan Feb 23, 2026
23f20a1
test: Facade 테스트 DTO 컨벤션 네이밍 반영
plan11plan Feb 23, 2026
2fd28f5
refactor: 상품 조회 메서드 네이밍 개선 (softDelete/Active → 도메인 의도 표현)
plan11plan Feb 23, 2026
4299018
refactor: 좋아요 toggleLike를 like/unlike로 분리하고 불필요한 enum 제거
plan11plan Feb 23, 2026
87d31fe
test: 좋아요 like/unlike 분리에 따른 테스트 코드 수정
plan11plan Feb 23, 2026
47b30b5
docs: 좋아요 설계 문서 like/unlike 분리 반영
plan11plan Feb 23, 2026
e05aa0e
refactor: 좋아요 정책을 likeCount 캐시에서 COUNT(*) 실시간 쿼리로 전환
plan11plan Feb 24, 2026
c3fe3c6
test: 좋아요 정책 전환에 따른 테스트 코드 수정
plan11plan Feb 24, 2026
e36bc89
docs: 좋아요 설계 문서 정책 전환 반영
plan11plan Feb 24, 2026
e91a0c4
docs: 프로젝트 컨벤션 스킬 문서에서 likeCount 예시 제거
plan11plan Feb 24, 2026
0f9d66b
test: 좋아요 API E2E 테스트 및 HTTP 요청 파일 추가
plan11plan Feb 24, 2026
f660be2
docs: 프로젝트 컨벤션 스킬에 인라인 변수 컨벤션 추가
plan11plan Feb 24, 2026
1353ab0
refactor: 인라인 변수 컨벤션 적용 (Domain, Controller, DTO 계층)
plan11plan Feb 24, 2026
51bb6da
refactor: Facade private 메서드를 도메인 계층으로 이동
plan11plan Feb 24, 2026
f09b463
docs: Facade private 메서드 금지 컨벤션 및 훅 추가
plan11plan Feb 24, 2026
6c27af0
refactor: OrderFacade 주문 생성 시 상품 조회를 IN절 일괄 조회로 변경
plan11plan Feb 24, 2026
ac96308
docs: 주문 설계 문서 유즈케이스 흐름에 IN절 일괄 조회 명시
plan11plan Feb 24, 2026
e250d8d
docs: Facade 일괄 조회 원칙 컨벤션 및 구현 후 DESIGN.md 대조 규칙 추가
plan11plan Feb 24, 2026
e83f1ca
refactor: OrderFacade 소유권 검증 로직을 OrderService로 이동
plan11plan Feb 24, 2026
3f06107
test: 주문 소유권 검증 테스트 수정 및 추가
plan11plan Feb 24, 2026
03029de
feat: 주문 도메인 기능 구현
plan11plan Feb 24, 2026
c306b9c
test: 주문 도메인 테스트 코드 추가
plan11plan Feb 24, 2026
7887016
docs: 컨벤션 문서 개선 (200 통일, V1 네이밍, Page 허용, CUD 반환 규칙)
plan11plan Feb 24, 2026
ca876f4
refactor: 주문 VO 정적 팩토리 메서드 패턴 적용
plan11plan Feb 24, 2026
a7109ec
test: 주문 VO 테스트 정적 팩토리 메서드 호출로 수정
plan11plan Feb 24, 2026
323f8c1
chore: 컨벤션 리뷰 에이전트 추가
plan11plan Feb 24, 2026
c9e93a7
docs: CLAUDE.md에 코드 스타일 핵심 규칙 및 리뷰 에이전트 참조 추가
plan11plan Feb 24, 2026
c024e5b
refactor: 전체 도메인 VO 제거 및 Entity 원시값 필드로 전환
plan11plan Feb 25, 2026
173f466
test: VO 제거에 따른 테스트 코드 수정 및 삭제된 VO 테스트 제거
plan11plan Feb 25, 2026
4c4c977
docs: VO 제거에 따른 설계 문서 업데이트
plan11plan Feb 25, 2026
2f96572
docs: VO 제거에 따른 컨벤션 문서 업데이트
plan11plan Feb 25, 2026
0011f21
chore: .gitignore에 .interview-state 추가
plan11plan Feb 25, 2026
b012b3e
chore: 면접 파트너 에이전트 추가
plan11plan Feb 25, 2026
3520e57
refactor: Product → Brand 참조를 객체참조에서 ID 참조로 변경
plan11plan Feb 25, 2026
d6c753b
test: Product → Brand ID 참조 변경에 따른 테스트 코드 수정
plan11plan Feb 25, 2026
baea619
refactor: Facade private 메서드를 BrandService로 이동 및 Chop-down 스타일 수정
plan11plan Feb 25, 2026
87d258f
docs: Product → Brand ID 참조 변경에 따른 설계 문서 업데이트
plan11plan Feb 25, 2026
cb651fa
docs: 노션 MCP 추가
plan11plan Feb 25, 2026
7517c00
feat: 상품 좋아요 수 조회 및 likes_desc 정렬 기능 구현
plan11plan Feb 27, 2026
957ed55
test: 상품 좋아요 수 조회 및 likes_desc 정렬 테스트 추가
plan11plan Feb 27, 2026
11802f2
fix: 상품 목록 조회 시 totalElements가 필터링된 크기로 반환되는 버그 수정
plan11plan Feb 27, 2026
7fca917
refactor: Order-OrderItem 양방향 연관관계 리팩토링
plan11plan Feb 27, 2026
4030a61
test: Order-OrderItem 양방향 연관관계 테스트 갱신
plan11plan Feb 27, 2026
c7bf786
docs: Order-OrderItem 양방향 연관관계 설계 문서 업데이트
plan11plan Feb 27, 2026
ef44547
refactor: OrderFacade 도메인 로직을 ProductService로 캡슐화
plan11plan Feb 27, 2026
00c03af
test: ProductService 재고 검증/차감 테스트 추가 및 OrderFacade 테스트 갱신
plan11plan Feb 27, 2026
6b707fc
docs: 주문 아이템 취소 설계 문서 업데이트
plan11plan Feb 27, 2026
20503c7
docs: @Embeddable 개념 그룹핑 컨벤션 추가
plan11plan Feb 27, 2026
3c2cfb7
feat: 주문 아이템 취소 기능 구현
plan11plan Feb 27, 2026
69e96f5
test: 주문 아이템 취소 테스트 추가
plan11plan Feb 27, 2026
466db2b
feat: 주문 아이템 취소 API 엔드포인트 추가
plan11plan Feb 27, 2026
89df73b
test: 주문 아이템 취소 API E2E 테스트 추가
plan11plan Feb 27, 2026
8a4016e
fix: Order-OrderItem cascade에 MERGE 추가하여 JpaRepository.save() 시 자식 엔티…
plan11plan Feb 27, 2026
919d750
refactor: ProductSnapshot 네이밍 및 @Embeddable 컨벤션 적용
plan11plan Feb 27, 2026
16002f6
test: ProductSnapshot/StockDeductionInfo 리팩토링에 따른 테스트 반영
plan11plan Feb 27, 2026
ce71fa5
docs: DTO 컨벤션 문서에 Domain Info/Command 배치 규칙 추가
plan11plan 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
115 changes: 115 additions & 0 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
## 프로젝트 개요

Spring Boot 기반 멀티모듈 Java 프로젝트. TDD 방식으로 개발하며, 테스트 가능한 구조를 목표로 한다.

---

## 기술 스택

- **Java 21**, **Spring Boot 3.4.4**, **Gradle Kotlin DSL**
- Spring Web, Spring Data JPA, Spring Data Redis, QueryDSL, Kafka, Spring Batch
- Lombok, Jackson, SpringDoc OpenAPI
- JUnit 5 + AssertJ + Mockito, Testcontainers (MySQL, Redis)

---

## 모듈 구조

```
apps/
├── commerce-api # REST API 서버
├── commerce-streamer # Kafka 스트리밍 처리
└── commerce-batch # 배치 작업

modules/
├── jpa # BaseEntity, QueryDSL/JPA/DataSource Config
├── redis # Redis 설정 및 Repository
└── kafka # Kafka 설정 및 Producer/Consumer

supports/
├── jackson # JSON 직렬화 설정
├── logging # 로깅 설정
└── monitoring # 모니터링 설정
```

---

## 아키텍처

계층 우선 패키지: `interfaces → application → domain ← infrastructure`

### 컨벤션

- 코딩 컨벤션: `.claude/skills/project-convention/` 참조 (코드 작성 시 해당 스킬의 references/ 하위 문서를 반드시 Read 도구로 읽을 것)
- 커밋 규칙: `.claude/skills/commit-convention/` 참조

### 코드 스타일 핵심 (매 작업 시 준수)

- 1회용 변수는 인라인 (2회 이상 참조 시에만 변수 추출)
- 메서드 체이닝 줄바꿈: 8-space continuation indent
- 닫는 괄호: 마지막 인자에 붙임 (별도 줄 금지)
- 컨텍스트가 길어질수록 컨벤션 누락 가능성 증가 → 코드 작성 전 관련 컨벤션 문서를 반드시 다시 Read할 것
- **기능 완료 후 커밋 전**: `.claude/agents/convention-review/AGENT.md`를 읽고 서브 에이전트(Sonnet) 리뷰를 실행할 것

### 설계 문서

기능 개발 시 해당 도메인의 설계 문서를 **먼저 읽고** 시작한다.

| 문서 | 경로 | 용도 |
|------|------|------|
| 공통 원칙 | `docs/spec/shared/CONVENTIONS.md` | 참조 방식, Soft Delete, 용어집 등 |
| 전체 구조 | `docs/spec/shared/OVERVIEW.md` | 전체 ERD + 클래스 다이어그램 |
| 도메인 스펙 | `docs/spec/{domain}/DESIGN.md` | 요구사항 + 유즈케이스 + 시퀀스 + ERD + 클래스 |

도메인: `brand`, `product`, `like`, `cart`, `order`

**참조 규칙:**
1. 해당 도메인의 `DESIGN.md`를 읽는다
2. 다른 도메인과 연동이 필요하면 그 도메인의 `DESIGN.md`도 읽는다
3. 전체 관계 확인이 필요하면 `OVERVIEW.md`를 읽는다
4. 구현 완료 후 `DESIGN.md`의 **'예외 및 정책'** 섹션과 **유즈케이스 기능 흐름**을 재확인하여, 각 항목이 코드에 반영되었는지 대조한다

---

## TDD 개발 모드

"TDD로 개발" 트리거 시 `.claude/skills/tdd/SKILL.md`를 읽고 시작한다. 아래 규칙은 **Round 진행 중 매 턴 적용**.

### 핵심 규칙

- Red 1개 → Green → Refactor → 다음 Red. **한 번에 여러 테스트 작성 금지**
- Red를 반드시 실행하여 **실패를 확인**한 후 Green 진행
- Green은 **통과할 최소 코드만**. 다음 시나리오까지 미리 구현 금지
- 기능 수직 슬라이스: 기능 하나를 Domain → Application 관통 후 다음 기능
- 매 Round 후 진행 문서(`docs/tdd/{domain}/{feature}.md`) 갱신

### 계층별 전략

| 계층 | 테스트 더블 | TDD 방식 |
|------|-----------|---------|
| Domain Entity/VO | 더블 불필요 | TFD |
| Domain Service | **Fake 우선** | TFD |
| Application Facade | Mockito mock() | TFD |
| Controller / Repository | - | TLD (별도 진행) |

### 테스트 실행

- Round 중: `./gradlew :apps:commerce-api:test --tests "{패키지}.{클래스}"`
- 전체 완료 후: `./gradlew :apps:commerce-api:test`

### 코드 작성

- 실제 동작하는 코드만. 불필요한 Mock 데이터 금지
- null-safety (Optional 활용), `println` 금지
- 기존 코드 패턴 분석 후 일관성 유지

---

## 프로젝트 실행

```bash
./gradlew :apps:commerce-api:bootRun # 개발 환경
./gradlew :apps:commerce-api:test # 특정 모듈 테스트
./gradlew test jacocoTestReport # 커버리지
docker compose up -d # 인프라
```
127 changes: 127 additions & 0 deletions .claude/agents/convention-review/AGENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Convention Review Agent

작업 완료 후 **서브 에이전트(Sonnet 4.6)**를 띄워 컨벤션 위반을 검출한다.

## 왜 서브 에이전트인가

메인 에이전트는 컨텍스트가 커질수록 스킬/컨벤션 문서의 attention이 약해져 위반을 놓친다.
서브 에이전트는 **매번 새 컨텍스트**로 시작하므로 컨벤션 문서에 대한 attention이 100%에 가깝다.

---

## 실행 절차

### Step 0: 사용자에게 알림

서브 에이전트를 실행하기 전에 **반드시** 사용자에게 알린다:

```
🔍 컨벤션 리뷰 에이전트(Sonnet)를 실행합니다. (~47초 소요)
대상: {변경 파일 수}개 Java 파일
검증: {적용할 컨벤션 문서 목록}
```

### Step 1: 변경 파일 파악

```bash
git diff --name-only HEAD
```

커밋 전이면 `git diff --name-only`와 `git diff --cached --name-only`로 변경 파일을 파악한다.
`.java` 파일만 필터링한다.

### Step 2: 변경 파일의 계층 분류

변경 파일을 계층별로 분류하고, 각 계층에 해당하는 컨벤션 문서를 결정한다.

| 파일 경로 패턴 | 계층 | 필수 컨벤션 문서 |
|--------------|------|----------------|
| `interfaces/` | Interface | `inline-variable-convention.md` |
| `application/` | Application | `inline-variable-convention.md`, `service-layer-convention.md` |
| `domain/` | Domain | `inline-variable-convention.md`, `entity-vo-convention.md` |
| `infrastructure/` | Infrastructure | `infrastructure-convention.md` |
| `*Dto*.java`, `*Request*.java`, `*Response*.java`, `*Result*.java`, `*Criteria*.java`, `*Command*.java`, `*Info*.java` | DTO | `inline-variable-convention.md`, `dto-convention.md` |

`inline-variable-convention.md`는 **모든 계층**에서 필수로 포함한다.

### Step 3: 서브 에이전트 실행

Task 도구로 서브 에이전트를 생성한다.

```
Task(
subagent_type: "general-purpose",
model: "sonnet",
prompt: <아래 프롬프트 템플릿>
)
```

### Step 4: 결과 보고

서브 에이전트의 결과를 사용자에게 보여준다.

- 위반 있음 → 파일:라인 — 위반 내용 — 수정 제안 형식으로 보고
- 위반 없음 → "컨벤션 위반 없음" 보고
- 오탐 가능성이 있는 항목은 별도 표시

---

## 서브 에이전트 프롬프트 템플릿

```
당신은 Java Spring 프로젝트의 코드 컨벤션 리뷰어입니다.

## 절차

1. 아래 컨벤션 문서를 Read로 읽으세요:
{계층별로 필요한 컨벤션 문서 절대경로 목록}

2. 아래 코드 파일을 Read로 읽으세요:
{변경된 .java 파일 절대경로 목록}

3. 컨벤션 문서의 규칙을 기준으로 코드를 검토하세요.

## 검토 항목

### 인라인 변수 (inline-variable-convention.md)
- 1회 참조 변수가 인라인되지 않고 남아있는가
- 2회 이상 참조 변수를 불필요하게 인라인하지 않았는가
- 메서드 호출 인자의 줄바꿈이 8-space continuation indent를 따르는가
- 닫는 괄호가 마지막 인자에 붙어 있는가 (별도 줄 X)
- Align-to-parenthesis를 사용하지 않았는가

### 계층별 규칙 (해당 계층의 컨벤션 문서)
- 컨벤션 문서에 명시된 규칙 위반이 있는가

## 검토 제외 (오탐 방지)

- **메서드 선언부 파라미터**의 들여쓰기는 검토하지 마세요.
8-space continuation indent는 **메서드 호출 인자**, **변수 할당의 우변**,
**return 문의 값** 등에 적용됩니다.
메서드 선언부 `public void foo(` 뒤의 파라미터 들여쓰기는 이 규칙의 대상이 아닙니다.
- **테스트 코드**는 프로덕션 코드와 다른 스타일을 허용합니다.
테스트의 가독성을 위한 변수 추출은 위반으로 보지 마세요.

## 보고 형식

위반이 있으면:
```
[위반] 파일명:라인번호 — 위반 규칙 — 설명
현재: (현재 코드)
수정: (수정 제안)
```

위반이 없으면:
```
컨벤션 위반 없음
```
```

---

## 주의사항

- 리뷰 모델은 **Sonnet 4.6** 사용 (비용 ~$0.05/회, 속도 ~47초)
- 컨벤션 문서는 **서브 에이전트가 직접 Read** — 메인 에이전트 컨텍스트에서 복사하지 않음
- 변경 파일이 많으면 계층별로 서브 에이전트를 **병렬** 실행 가능
- 오탐이 발견되면 이 문서의 "검토 제외" 섹션에 추가할 것
Loading