チュートリアル

私が使っているPRD生成スキルを紹介します

AAnonymous
15分で読めます

はじめに

機能実装が行き詰まる瞬間は、意外にもコードを書き始めたあとではなく、その前に来ることが多いです。何を作るのか、どこまで作るのか、どんな順序で分解するのか、既存コードの何を参考にすべきかが整理されていないまま実装に入ると、エージェントも人もぶれてしまいます。

私はそのため、PRDを単なる企画文書としては見ていません。今のようなAIコーディング環境では、PRDはほとんど実行計画に近いものです。特にClaude Codeのようなコーディングエージェントを使っているなら、何を作るかよりも、どう構造化して渡すかが結果の密度を大きく左右します。

今回の記事では、私が使っている .claude/skills/prd-generator スキルを1つ紹介します。このスキルは新しい機能要件を対話型で集め、Claude Codeがそのまま実装フェーズへ進めるPRD文書に整理してくれるスキルです。資料共有用の記事でもあるので、途中の要約だけで終わらせず、後半には SKILL.md とテンプレート全文もそのまま載せておきます。

なぜこのようなスキルが必要だったのか

機能を作る前にざっくりメモを残すことと、実際に実装可能なPRDを作ることは、まったく別の作業です。

簡単なアイデアメモは速いですが、すぐに抜け漏れが出ます。

  • 核心機能は書いてあるのにユーザーシナリオがない
  • 実装計画はあるのに受け入れ基準がない
  • 参照すべき既存コードがあるのに結び付いていない
  • あとでどの実装スキルを使うべきかが抜ける
  • 文書をどこにどんな名前で保存するかが毎回変わる

こうした状態では、文書があってもすぐ実行にはつながりません。結局、また質問し、また整理し、また構造を組み直す必要があります。

prd-generator は、まさにその中間の無駄を減らすために作ったスキルです。質問を投げる順序、文書形式、保存ルール、実装ステップ、実装スキル連携まで一度に決めておけば、PRDは単なる説明文ではなく、そのまま作業できる実行単位になります。

このスキルを一文で説明すると

私がこのスキルを最も短く説明するときは、こう言います。

prd-generator新機能に関する要件を対話型で収集したあと、Claude Code の実行に最適化された包括的な PRD 文書へ変換するスキル です。

実際の構成もシンプルです。

.claude/skills/prd-generator/
  SKILL.md
  assets/
    prd_template.md

しかし、フォルダ構成がシンプルだからといって役割まで小さいわけではありません。単にいくつか質問して終わるのではなく、文書保存ルールから実装計画の形式、受け入れ基準、さらにはどの実装スキルを続けて使うべきかまで一緒に決めてくれます。

ワークフローを追うと設計意図がよりよく見えてきます

このスキルの核心は、対話の流れがよく設計されていることです。PRDを一気に書き下ろすのではなく、必要な情報を順番に集める方式で設計されています。

1段階: 機能の探索

最初に、機能の概要、核心機能、主要なユースケースを尋ねます。

ここで重要なのは、質問を一度にまとめて浴びせないことです。スキル文書にも「すべての質問を一度に投げないでください」と明記されています。この一文は思った以上に重要です。良いPRDは、質問票のように一気に絞り出すものではなく、回答に合わせて範囲を絞り込みながら作るものだからです。

2段階: 参照実装の確認

次に、既存コードや実装パターンを尋ねます。

この段階が良い理由は明確です。実務では、新機能が完全に白紙のキャンバスから始まるより、既存構造に合わせる必要がある場合のほうがはるかに多いからです。パスを受け取り、従うべきパターンとルールを確認すれば、PRDはもはや抽象的な企画書ではなく、実際のコードベースに接続された作業文書になります。

3段階: 拡張性とアーキテクチャ

その次に、今後の成長、統合ポイント、性能要件を尋ねます。

私はこの部分が特に良いと思っています。簡単な機能を実装するときでも、とりあえず動けばよいという誘惑は常にあります。しかしこのスキルは、初期段階から拡張性に関する質問を入れることで、最低限のレベルでも将来の負債を文書に残せるようにしています。

4段階: 保存先の決定

ここでは、ディレクトリのフルパスをユーザーにすべて決めさせません。ファイル名だけを確認し、文書生成ルールに従って保存パスを自動で計算します。

この選択もかなり実用的です。人が毎回パスとファイル名を同時に考えるようにすると、文書は散らばります。逆に保存ルールを固定しておけば、あとで文書を探しやすくなり、PRDが作業資産として蓄積されます。

5段階: 実際のPRD生成

最後の段階では、テンプレートを読み、プレースホルダーを埋め、使うべき実装スキルを判断して文書を完成させます。

ここでこのスキルの正体が最もはっきり表れます。単に「企画書を書いてくれる」のではなく、次の要素を漏れなく埋めた 実行型PRD を作ることが目的です。

  • 機能名と概要
  • 詳細な機能説明
  • 参照実装
  • 拡張性の考慮事項
  • 4段階の実装計画
  • 各段階の受け入れ基準
  • ファイル構造
  • 核心実装の詳細
  • テスト戦略
  • 潜在的な課題と解決策
  • 今後の改善事項
  • 実装時に使うスキル

文書生成ルールまで備えている点が重要です

prd-generator は、質問がうまいだけのスキルではありません。生成されたPRDをどこに保存するかまで強く定義しています。

documents/PRD/{연}-{월}-{주차}w/{일}d-{hh}h-{파일명}.md

このルールは思った以上に重要です。文書がプロジェクト資産として残るためには、内容だけでなく保存方式も一貫していなければならないからです。このスキルは週番号の計算ルールまで定めており、ディレクトリがなければ自動生成するよう明記しています。

つまり、このスキルは文書を「うまく書くこと」で止まらず、後からも継続的に管理できる状態で残すところまで気を配っています。

テンプレートが長いことは、むしろ長所です

このスキルのテンプレートを初めて見ると、かなり長いと感じるかもしれません。しかし私は、この長さこそがむしろ長所だと思っています。

短いテンプレートは速い反面、人が自分で埋めなければならない空白も多くなります。逆にこのテンプレートは、最初から必要な欄をほぼすべて表に出しています。

  • 概要
  • 機能説明
  • 参照実装
  • 核心機能
  • 拡張性の考慮事項
  • 4段階の実装計画
  • ファイル構造
  • 核心実装の詳細
  • テスト戦略
  • 潜在的な課題と解決策
  • 今後の改善事項
  • 実装時に使うスキル
  • Claude Code 実行時の参考事項

これほど項目が開かれていれば、少なくとも何を落としているかはすぐ見えます。私はPRDテンプレートの価値をまさにここに見ています。良いテンプレートは文書をきれいに見せる道具ではなく、思考の抜け漏れを減らす道具です。

実装スキル連携こそがこのスキルの核心です

このスキルで私が最も気に入っている点は別にあります。それは、PRD生成時に 実装スキルを判断して文書に含める ことです。

多くのPRDは文書そのもので終わります。しかし実際の作業では、その次の一手のほうが重要です。どの実装スキルを使い、どの順序で呼び出すべきかまでつながっていなければ、PRDと実装は再び分断されてしまいます。

prd-generator はこれを防ぐために、実装スキル連携セクションを別に持っています。

現行の文書基準では、次の2つのスキルを中心に判断します。

スキル名有効化条件担当範囲
endpoint-implement-skillEntity, Repository, Service, Controller, DTO のいずれかを含むCRUD API 全レイヤー実装
sse-streaming-skillSSE ストリーミング、TEXT_EVENT_STREAM_VALUE、リアルタイム応答を含むSSE コントローラー / サービス実装

この判断ロジックが良い理由も明確です。PRDが単なる説明書ではなく、次の行動を指定する文書になるからです。

たとえば、Entity から Controller まで必要な機能であれば endpoint-implement-skill を使うべきだとはっきり残せます。AI応答ストリーミングのような要件があるなら、sse-streaming-skill をどの段階で組み込むべきかまで案内できます。こうした接続があると、文書を読む人もエージェントも、はるかに迷いにくくなります。

このスキルが向いている場面

このスキルが常に必要というわけではありません。ただし、次のような場面では特に強みを発揮します。

  • 新機能をゼロから設計しなければならないとき
  • 参照すべき既存コードが明確にあるとき
  • 機能要件はあるが実装順序がまだ曖昧なとき
  • 後で Claude Code や別の実装スキルにそのままつなげる予定があるとき
  • 文書をチーム資産として残す必要があるとき

一方で、ごく短い設定変更や小規模な修正だけが必要な場合には、やや大げさかもしれません。このスキルは軽いメモのための道具というより、機能開発を構造化して引き渡すための道具 に近いです。

資料共有用に原文全文も残しておきます

ここまでが説明だとすれば、ここから先は実際に資料共有するための付録です。ご要望どおり、.claude/skills/prd-generator の核心内容を省略せずそのまま確認できるように、SKILL.mdassets/prd_template.md の全文を一緒に載せておきます。

付録 1. .claude/skills/prd-generator/SKILL.md 全文

Markdown
---
name: prd-generator
description: 기능 개발을 위한 대화형 PRD(제품 요구사항 문서) 생성기. 사용자가 새로운 기능에 대한 체계적인 구현 계획을 작성하고자 할 때 사용합니다. 이 스킬은 대화형 질문을 통해 요구사항을 수집한 후, Claude Code 실행에 최적화된 포괄적인 PRD 문서를 생성합니다. "PRD 만들어줘", "기능 기획해줘", "구현 계획 작성해줘", "기능 요구사항 문서화해줘" 등의 요청 시 활성화됩니다.
---

# PRD Generator (한글 버전)

이 스킬은 대화형 질문 프로세스를 통해 포괄적인 제품 요구사항 문서(PRD)를 생성합니다. 생성된 PRD는 Claude Code가 구현 계획을 효율적으로 실행할 수 있도록 최적화되어 있습니다.

## 워크플로우

스킬이 활성화되면 다음 대화형 워크플로우를 따르세요:

### 1단계: 기능 탐색

사용자가 원하는 기능에 대해 질문합니다. 다음 가이드 질문을 사용하세요 (상황에 맞게 조정):

1. **기능 개요**: "어떤 기능을 구현하고 싶으신가요? 상위 수준의 설명을 제공해주세요."
2. **기능 상세**: "이 기능의 핵심 기능과 사용자 상호작용을 설명해주실 수 있나요?"
3. **사용 사례**: "이 기능의 주요 사용 사례나 시나리오는 무엇인가요?"

사용자 응답을 기다린 후 진행하세요. 모든 질문을 한 번에 던지지 마세요.

### 2단계: 참조 구현

참조로 사용할 수 있는 기존 코드에 대해 질문합니다:

1. **기존 구현**: "참조해야 할 기존 코드나 구현이 있나요?"
2. **파일 경로**: 있다면: "이러한 참조 구현의 파일 경로는 무엇인가요?"
3. **따라야 할 패턴**: "이러한 참조에서 따라야 할 특정 패턴, 아키텍처 또는 규칙이 있나요?"

### 3단계: 확장성 및 아키텍처

확장성 및 확장 가능성에 대한 정보를 수집합니다:

1. **향후 성장**: "어떤 확장성 고려사항을 다루어야 하나요? 예: 사용자 부하, 데이터 볼륨, 기능 확장 등"
2. **통합 지점**: "이 기능이 다른 시스템이나 서비스와 통합되어야 하나요?"
3. **성능 요구사항**: "특정 성능 요구사항이나 제약사항이 있나요?"

### 4단계: 저장 위치

PRD 문서는 **문서 생성 규칙**에 따라 자동으로 경로가 결정됩니다.
사용자에게 파일명만 확인받고, 디렉토리는 자동 생성합니다.

1. **파일명 확인**: "PRD 문서의 파일명을 지정해주세요 (예: `AI_SCENARIO_GENERATOR`)"
   - 제공되지 않으면 기능명을 UPPER_SNAKE_CASE로 변환하여 사용

---

## 문서 생성 규칙

### 디렉토리 구조

```

documents/PRD/{연}-{월}-{주차}w/

```

- **연**: 4자리 연도 (예: 2025)
- **월**: 2자리 월 (예: 12)
- **주차**: 해당 월의 주차 (1~5) + `w` 접미사 (week의 약자)

**주차 계산**: 해당 월 1일부터 시작하여 7일 단위로 계산
- 1~7일: 1w (1주차)
- 8~14일: 2w (2주차)
- 15~21일: 3w (3주차)
- 22~28일: 4w (4주차)
- 29일~: 5w (5주차)

### 파일명 형식

```

{일}d-{hh}h-{파일명}.md

```

- **일**: 2자리 일 + `d` 접미사 (day의 약자, 예: 27d)
- **hh**: 2자리 시간(24시간제) + `h` 접미사 (hour의 약자, 예: 14h)
- **파일명**: UPPER_SNAKE_CASE (예: AI_SCENARIO_GENERATOR)

### 예시

2025년 12월 27일 14시에 AI 시나리오 생성기 PRD 생성 시:
```

documents/PRD/2025-12-4w/27d-14h-AI_SCENARIO_GENERATOR.md

```

### 디렉토리 자동 생성

지정된 디렉토리가 없으면 자동으로 생성합니다.

### 5단계: PRD 생성

모든 정보가 수집되면:

1. `assets/prd_template.md`에서 템플릿 읽기
2. **구현 시 사용할 스킬 판단** (아래 "구현 스킬 연동" 섹션 참조)
3. 다음 내용으로 모든 템플릿 플레이스홀더를 채워 포괄적인 PRD 생성:
   - 기능 이름 및 개요
   - 상세한 기능 설명
   - 참조 구현 세부사항 (제공된 경우)
   - 확장성 고려사항
   - 구체적인 작업이 포함된 4단계 구현 계획
   - 각 단계별 수용 기준
   - 파일 구조 개요
   - 논리적 섹션으로 나뉜 핵심 구현 세부사항
   - 테스트 전략
   - 잠재적 과제 및 해결책
   - 향후 개선 아이디어
   - **구현 시 사용할 스킬 (필수)**

3. 적절한 구조로 PRD 생성:
   - 명확한 단계별 구현 계획
   - 구체적이고 실행 가능한 작업
   - 구체적인 수용 기준
   - Claude Code가 따를 수 있는 기술적 세부사항
   - 파일 조직 지침

4. 지정된 경로에 PRD 저장
5. 사용자에게 문서 링크 제공

## 템플릿 구조

PRD 템플릿(`assets/prd_template.md`)은 다음을 포함합니다:

- **개요**: 기능의 상위 수준 요약
- **기능 설명**: 상세한 기능
- **참조 구현**: 기존 코드에 대한 링크
- **기술 요구사항**: 핵심 기능 및 확장성
- **구현 계획**: 작업 및 수용 기준이 포함된 4단계
  - 1단계: 설정 및 기반
  - 2단계: 핵심 구현
  - 3단계: 통합 및 테스트
  - 4단계: 다듬기 및 최적화
- **파일 구조**: 제안된 디렉토리 레이아웃
- **핵심 구현 세부사항**: 기술적 세부사항
- **테스트 전략**: 구현 검증 방법
- **과제 및 해결책**: 예상되는 문제
- **향후 개선사항**: 확장 지점
- **Claude Code 실행 참고사항**: PRD 사용 방법

## 모범 사례

1. **대화형으로 진행**: 한 번에 한두 가지 질문을 자연스럽게 던지세요
2. **질문 조정**: 사용자 응답에 따라 후속 질문을 맞춤화하세요
3. **모호함 명확화**: 사용자 응답이 모호하면 구체적인 예를 요청하세요
4. **모듈식 사고**: 복잡한 기능을 논리적 단계로 나누세요
5. **구체적으로**: 추상적인 목표가 아닌 구체적인 작업을 생성하세요
6. **코드 참조**: 참조 구현이 있다면 읽고 패턴을 통합하세요
7. **확장성 고려**: 간단한 기능이라도 항상 확장성 고려사항을 포함하세요
8. **실행 가능하게**: 각 단계는 Claude Code가 실행할 수 있는 명확한 작업이 있어야 합니다

## 대화 흐름 예시

```

사용자: "사용자 인증 시스템에 대한 PRD를 만들고 싶어요"

Claude: "좋습니다! 사용자 인증 시스템에 대한 포괄적인 PRD를 작성하도록 도와드리겠습니다.

먼저, 원하시는 핵심 기능을 설명해주시겠어요? 예를 들어:

- 어떤 인증 방법을 사용하나요? (이메일/비밀번호, OAuth 등)
- 어떤 사용자 역할이나 권한이 필요한가요?
- 특정 보안 요구사항이 있나요?"

사용자: [세부사항 제공]

Claude: "감사합니다! 제가 참조해야 할 기존 인증 코드나 유사한 구현이 코드베이스에 있나요?"

사용자: [경로 제공 또는 없다고 답변]

Claude: "어떤 확장성 고려사항을 염두에 두어야 할까요? 예를 들어:

- 예상 사용자 수는?
- 속도 제한이 필요한가요?
- 세션 관리 전략은?"

사용자: [세부사항 제공]

Claude: "마지막으로, 이 PRD 문서를 어디에 저장하시겠어요?"

사용자: [경로 제공 또는 Claude가 기본값 사용하도록 함]

Claude: [포괄적인 PRD 생성 및 저장]
"사용자 인증 시스템에 대한 PRD를 작성했습니다. [문서 보기](computer:///path/to/prd.md)"

```

## PRD 생성 팁

- **1단계**는 설정에 집중: 의존성, 기본 구조, 구성
- **2단계**는 핵심 기능 구현
- **3단계**는 통합 지점 및 테스트 처리
- **4단계**는 다듬기 추가: 오류 처리, 엣지 케이스, 최적화
- 각 단계는 이전 단계를 기반으로 구축되어야 함
- 수용 기준은 테스트 가능하고 구체적이어야 함
- 참조 구현 패턴을 따르는 파일 구조 포함 (제공된 경우)
- **모든 내용은 한글로 작성**: 기능 설명, 작업, 수용 기준, 주석 등 모두 한글로 작성

---

## 구현 스킬 연동 (핵심)

PRD 생성 시 **반드시** 구현에 필요한 스킬을 판단하여 문서에 포함해야 합니다.
이를 통해 구현 일관성을 확보하고, 프로젝트 규약을 자동으로 준수할 수 있습니다.

### 스킬 판단 기준

| 스킬명 | 활성화 조건 | 담당 범위 |
|--------|------------|----------|
| `endpoint-implement-skill` | Entity, Repository, Service, Controller, DTO 중 **하나라도** 포함 | CRUD API 전체 레이어 구현 |
| `sse-streaming-skill` | SSE 스트리밍, `TEXT_EVENT_STREAM_VALUE`, 실시간 응답 포함 | SSE 컨트롤러/서비스 구현 |

### 스킬 판단 로직

PRD 내용을 분석하여 다음 키워드가 있으면 해당 스킬 사용을 안내합니다:

**endpoint-implement-skill 활성화 키워드:**
- Entity, 엔티티
- Repository, 레포지토리, JPA
- Service, 서비스
- Controller, 컨트롤러, API 엔드포인트
- DTO, Request, Response
- CRUD, 생성, 조회, 수정, 삭제

**sse-streaming-skill 활성화 키워드:**
- SSE, Server-Sent Events
- TEXT_EVENT_STREAM_VALUE
- 스트리밍 응답, 실시간 스트리밍
- SseEmitter, Flux<ServerSentEvent>
- 실시간 이벤트 전송

### PRD에 작성할 스킬 안내 예시

```markdown
## 구현 시 사용할 스킬

이 PRD를 구현할 때 다음 스킬을 **반드시** 활용하세요:

| 구현 영역 | 사용 스킬 | 활성화 조건 |
|----------|----------|------------|
| Entity ~ Controller | `endpoint-implement-skill` | 시나리오 CRUD API 구현 필요 |
| SSE 스트리밍 | `sse-streaming-skill` | AI 응답 실시간 스트리밍 필요 |

### 스킬 사용 순서

1. **1단계 (Entity/Repository)**: `endpoint-implement-skill` 호출
   - Entity 정의, Repository 생성
2. **2단계 (Service/Controller)**: `endpoint-implement-skill` 계속 사용
   - Service 비즈니스 로직, Controller 엔드포인트
3. **3단계 (SSE 통합)**: `sse-streaming-skill` 호출
   - SSE 컨트롤러, 스트리밍 서비스 구현

### 스킬별 담당 범위

**endpoint-implement-skill:**
- `entity/Scenario.kt`, `entity/Character.kt` 등 Entity 파일
- `ScenarioRepository.kt` 등 Repository 인터페이스
- `ScenarioService.kt` 등 Service 클래스
- `ScenarioController.kt` 등 Controller 클래스
- `ScenarioRequestDto.kt`, `ScenarioResponseDto.kt` 등 DTO

**sse-streaming-skill:**
- `GameChatSseController.kt` SSE 전용 컨트롤러
- `GameChatStreamService.kt` 스트리밍 서비스
- SSE 이벤트 타입, 이미터 설정
```

### 복합 스킬 사용 시 주의사항

1. **스킬 간 경계를 명확히**: Entity~Controller는 endpoint-implement-skill, SSE 전용 로직은 sse-streaming-skill
2. **순서 준수**: 기반 Entity/Service가 먼저, SSE 통합은 나중에
3. **스킬 호출 시점 명시**: PRD의 각 단계에서 어떤 스킬을 호출해야 하는지 명시

### 스킬이 필요 없는 경우

다음 경우에는 스킬 연동 섹션을 생략할 수 있습니다:

- 설정 파일(application.yml) 변경만 필요한 경우
- 기존 코드 수정/리팩토링만 필요한 경우
- 문서화, 마이그레이션 가이드 등 비코드 작업

付録 2. .claude/skills/prd-generator/assets/prd_template.md 全文

Markdown
# PRD: {{기능명}}

## 개요

{{기능_개요}}

## 기능 설명

{{기능_상세_설명}}

## 참조 구현

{{참조_구현}}

## 기술 요구사항

### 핵심 기능

{{핵심_기능}}

### 확장성 고려사항

{{확장성_고려사항}}

## 구현 계획

### 1단계: 설정 및 기반

**목표**: {{1단계_목표}}

**작업**:

1. {{1단계_작업1}}
2. {{1단계_작업2}}
3. {{1단계_작업3}}

**수용 기준**:

- {{1단계_수용기준1}}
- {{1단계_수용기준2}}

---

### 2단계: 핵심 구현

**목표**: {{2단계_목표}}

**작업**:

1. {{2단계_작업1}}
2. {{2단계_작업2}}
3. {{2단계_작업3}}

**수용 기준**:

- {{2단계_수용기준1}}
- {{2단계_수용기준2}}

---

### 3단계: 통합 및 테스트

**목표**: {{3단계_목표}}

**작업**:

1. {{3단계_작업1}}
2. {{3단계_작업2}}
3. {{3단계_작업3}}

**수용 기준**:

- {{3단계_수용기준1}}
- {{3단계_수용기준2}}

---

### 4단계: 다듬기 및 최적화

**목표**: {{4단계_목표}}

**작업**:

1. {{4단계_작업1}}
2. {{4단계_작업2}}
3. {{4단계_작업3}}

**수용 기준**:

- {{4단계_수용기준1}}
- {{4단계_수용기준2}}

## 파일 구조

```

{{파일_구조}}

```

## 핵심 구현 세부사항

### {{세부사항1_제목}}

{{세부사항1_내용}}

### {{세부사항2_제목}}

{{세부사항2_내용}}

### {{세부사항3_제목}}

{{세부사항3_내용}}

## 테스트 전략

{{테스트_전략}}

## 잠재적 과제 및 해결책

{{과제_및_해결책}}

## 향후 개선사항

{{향후_개선사항}}

## 구현 시 사용할 스킬

이 PRD를 구현할 때 다음 스킬을 **반드시** 활용하세요:

| 구현 영역 | 사용 스킬 | 활성화 조건 |
|----------|----------|------------|
| {{skill_table_rows}} |

### 스킬 사용 순서

{{skill_usage_order}}

### 스킬별 담당 범위

{{skill_coverage}}

---

## Claude Code 실행 참고사항

이 PRD는 순차적 구현을 위해 구조화되었습니다:

1. 1단계 작업부터 순서대로 시작
2. 각 단계는 이전 단계를 기반으로 구축됨
3. 다음 단계로 넘어가기 전에 수용 기준 검증
4. 구체적인 지침은 "핵심 구현 세부사항" 섹션 참조
5. 각 단계 검증 시 "테스트 전략" 사용
6. **위 "구현 시 사용할 스킬" 섹션의 스킬을 반드시 활용하여 구현 일관성 확보**

まとめ

私は、今のようにAIコーディング環境が速くなるほど、実装そのものが上手いこと以上に、実装へ移る直前の整理能力が重要になると考えています。prd-generator はまさにその地点を扱うスキルです。

このスキルがしていることは大げさではありません。機能を尋ね、参照実装を確認し、拡張性を尋ね、保存ルールを適用し、実装可能なPRDに整理することです。しかし、このプロセスを一度構造として作っておけば、その後の実装ははるかにぶれにくくなります。

もしClaude Codeで機能開発を頻繁にしていて、毎回アイデアはあるのに実行計画が曖昧なせいで出発が遅れるなら、私はまずこのスキルから整理しておくことをかなりおすすめします。思っている以上に多くの生産性は、コードをより速く書くことからではなく、コードを書く前により正確に整理することから生まれるからです。

別添

スキルで生成された文書を1つ添付します。この文書がどんなプロンプトで生成されたのかを考えてみるのも面白いかもしれません。

# Blog Service 다국어 번역 구조 도입 PRD

## 📋 개요

| 항목 | 내용 |
|------|------|
| **문서 ID** | PRD-2026-01-24-BLOG-MULTILANG |
| **작성일** | 2026-01-24 |
| **작성자** | Claude Code |
| **상태** | ✅ 완료 |
| **대상 서비스** | blog-service |

## 🎯 목표

Flashcard/FlashcardTranslation 패턴을 blog-service에 도입하여 Post, Category, Comment, Tag 엔티티의 다국어 지원을 구현한다.

## 📊 진행 현황

| # | Phase | 작업 항목 | 상태 | 완료일 |
|---|-------|----------|------|--------|
| 1 | Entity | PostTranslation.kt | ✅ 완료 | 2026-01-24 |
| 2 | Entity | CategoryTranslation.kt | ✅ 완료 | 2026-01-24 |
| 3 | Entity | CommentTranslation.kt | ✅ 완료 | 2026-01-24 |
| 4 | Entity | TagTranslation.kt | ✅ 완료 | 2026-01-24 |
| 5 | Repository | PostTranslationRepository.kt | ✅ 완료 | 2026-01-24 |
| 6 | Repository | CategoryTranslationRepository.kt | ✅ 완료 | 2026-01-24 |
| 7 | Repository | CommentTranslationRepository.kt | ✅ 완료 | 2026-01-24 |
| 8 | Repository | TagTranslationRepository.kt | ✅ 완료 | 2026-01-24 |
| 9 | DTO | PostDto.kt 수정 | ✅ 완료 | 2026-01-24 |
| 10 | DTO | CategoryDto.kt 수정 | ✅ 완료 | 2026-01-24 |
| 11 | DTO | CommentDto.kt 수정 | ✅ 완료 | 2026-01-24 |
| 12 | DTO | TagDto.kt 수정 | ✅ 완료 | 2026-01-24 |
| 13 | DTO | TranslationDto.kt 신규 | ✅ 완료 | 2026-01-24 |
| 14 | Service | PostService.kt 수정 | ✅ 완료 | 2026-01-24 |
| 15 | Service | CategoryService.kt 수정 | ✅ 완료 | 2026-01-24 |
| 16 | Service | CommentService.kt 수정 | ✅ 완료 | 2026-01-24 |
| 17 | Service | TagService.kt 수정 | ✅ 완료 | 2026-01-24 |
| 18 | Service | TranslationService.kt 신규 | ✅ 완료 | 2026-01-24 |
| 19 | Controller | PostController.kt 수정 | ✅ 완료 | 2026-01-24 |
| 20 | Controller | CategoryController.kt 수정 | ✅ 완료 | 2026-01-24 |
| 21 | Controller | CommentController.kt 수정 | ✅ 완료 | 2026-01-24 |
| 22 | Controller | TagController.kt 수정 | ✅ 완료 | 2026-01-24 |
| 23 | Controller | BoTranslationController.kt 신규 | ✅ 완료 | 2026-01-24 |

**진행률: 23/23 (100%) ✅ 완료**

---

## 🏗️ 기술 설계

### 1. 번역 대상 필드

| 엔티티 | 번역 필드 | 원본 길이 | 번역 길이 (2배) |
|--------|----------|----------|----------------|
| Post | title | 200 | 400 |
| Post | excerpt | TEXT | TEXT |
| Post | content | TEXT | TEXT |
| Category | name | 100 | 200 |
| Category | description | TEXT | TEXT |
| Comment | content | TEXT | TEXT |
| Tag | name | 50 | 100 |

### 2. 핵심 패턴 (Flashcard 검증 완료)

#### 2.1 Entity 패턴
```kotlin
@Entity
@Table(indexes = [...])
@IdClass(PostTranslationPk::class)
data class PostTranslation(
  @Id @Column(updatable = false)
  val postId: Long,

  @Id @Column(length = 5, updatable = false)
  val languageCode: String,

  // 번역 필드들
  var title: String,
  var excerpt: String?,
  var content: String
) : BaseTimeEntity()

data class PostTranslationPk(
  val postId: Long? = null,
  val languageCode: String? = null,
) : Serializable
```

#### 2.2 DTO 패턴

```kotlin
data class DetailResponse(
  // 원본 필드
  @get:JvmName("titleOriginal")
  private val title: String,

  // 번역 필드 (JSON 숨김)
  @JsonIgnore
  val translatedTitle: String? = null,

  // 실제 응답 (번역 우선)
  @JsonGetter("title")
  fun getTitle(): String =
    translatedTitle?.takeIf { it.isNotBlank() } ?: title
)
```

#### 2.3 Service JOIN 패턴

```kotlin
queryFactory
  .select(PostDto.ListResponse.buildProjectionWithTranslation())
  .from(post)
  .leftJoin(postTranslation)
  .on(postTranslation.postId.eq(post.id)
    .and(postTranslation.languageCode.eq(lang)))
  .fetch()
```

#### 2.4 Controller 패턴

```kotlin
@GetMapping("/posts")
fun findAll(
  @RequestParam(required = false) lang: String?,
  // ...
): JPage<PostDto.ListResponse>
```

### 3. 지원 언어 코드

---

## 📁 파일 경로

```
modules/blog-service/src/main/kotlin/com/jongmin/blog/
├── entity/
│   ├── PostTranslation.kt       # 신규
│   ├── CategoryTranslation.kt   # 신규
│   ├── CommentTranslation.kt    # 신규
│   └── TagTranslation.kt        # 신규
├── repository/
│   ├── PostTranslationRepository.kt       # 신규
│   ├── CategoryTranslationRepository.kt   # 신규
│   ├── CommentTranslationRepository.kt    # 신규
│   └── TagTranslationRepository.kt        # 신규
├── dto/
│   ├── PostDto.kt         # 수정
│   ├── CategoryDto.kt     # 수정
│   ├── CommentDto.kt      # 수정
│   ├── TagDto.kt          # 수정
│   └── TranslationDto.kt  # 신규
├── service/
│   ├── PostService.kt         # 수정
│   ├── CategoryService.kt     # 수정
│   ├── CommentService.kt      # 수정
│   ├── TagService.kt          # 수정
│   └── TranslationService.kt  # 신규
└── controller/
    ├── PostController.kt         # 수정
    ├── CategoryController.kt     # 수정
    ├── CommentController.kt      # 수정
    ├── TagController.kt          # 수정
    └── BoTranslationController.kt # 신규
```

---

## 📝 작업 로그

### 2026-01-24

- **15:00** - PRD 문서 생성, 작업 계획 수립 완료

---

## 🔗 참조

- **레퍼런스 구현**: `legacy-service/catch_on/platform/entity/FlashcardTranslation.kt`
- **레퍼런스 서비스**: `legacy-service/catch_on/platform/service/SubjectService.kt`
- **레퍼런스 DTO**: `legacy-service/catch_on/platform/dto/response/FlashCardResponseDto.kt`