# CRUD 게시판 페이지 개발 계획

> 기존 읽기 전용(`GET /api/samples`) → **Create, Read, Update, Delete** 확장

---

## 1. 작업 개요

현재 `SampleListPage.vue`는 단순 목록 조회만 가능. 아래 작업으로 완전한 CRUD 게시판으로 확장한다.

| 동작 | HTTP | 엔드포인트 | 현재 상태 |
|------|------|-----------|-----------|
| 목록 조회(List) | `GET` | `/api/samples` | ✅ 완료 |
| 상세 조회(Read) | `GET` | `/api/samples/{id}` | ❌ 없음 |
| 생성(Create) | `POST` | `/api/samples` | ❌ 없음 |
| 수정(Update) | `PUT` | `/api/samples/{id}` | ❌ 없음 |
| 삭제(Delete) | `DELETE` | `/api/samples/{id}` | ❌ 없음 |

---

## 2. 작업 단계

### Step 1: 백엔드 — API 완성

**파일:** `backend/schemas.py`

- `SampleCreate(title, content, author)` — POST 요청 바디
- `SampleUpdate(title, content, author)` — PUT 요청 바디 (모두 optional)

**파일:** `backend/routers/samples.py`

기존 `list_samples` 유지 + 아래 4개 엔드포인트 추가:

| 메서드 | 경로 | 함수명 | 설명 |
|--------|------|--------|------|
| `GET` | `/api/samples/{id}` | `get_sample` | 단건 조회, 없으면 404 |
| `POST` | `/api/samples` | `create_sample` | 새 글 등록, 생성된 레코드 반환 |
| `PUT` | `/api/samples/{id}` | `update_sample` | 수정, 없으면 404 |
| `DELETE` | `/api/samples/{id}` | `delete_sample` | 삭제, 없으면 404 |

**예상 프롬프트:**

> `backend/schemas.py`에 `SampleCreate`(title, content, author 필수)와 `SampleUpdate`(모든 필드 optional) Pydantic 모델을 추가해주세요. `backend/routers/samples.py`에 GET/POST/PUT/DELETE `/api/samples` 및 `/api/samples/{id}` 엔드포인트를 구현해주세요. 상세 조회/수정/삭제는 id로 단건 처리하고, 없을 경우 HTTP 404를 반환해야 합니다.

---

### Step 2: 프론트엔드 — 상세보기 페이지

**파일:** `frontend/src/pages/SampleDetailPage.vue`

- 경로: `/samples/:id`
- `mounted()`에서 `fetch('/api/samples/{id}')` 호출
- 제목, 내용, 작성자, 생성일시 표시
- "목록으로", "수정", "삭제" 버튼
- 삭제 버튼 → confirm → `fetch('DELETE /api/samples/{id}')` → 목록 이동

**예상 프롬프트:**

> `frontend/src/pages/SampleDetailPage.vue`를 Vue 3 Options API로 만들어주세요. URL 파라미터 `:id`로 단건 조회(GET /api/samples/{id})하여 제목, 내용, 작성자, 생성일시를 표시합니다. 하단에 "목록으로", "수정", "삭제" 버튼을 두고, 삭제는 confirm 후 DELETE 요청 후 /samples로 이동합니다.

---

### Step 3: 프론트엔드 — 생성/수정 폼 페이지

**파일:** `frontend/src/pages/SampleFormPage.vue`

- 경로: `/samples/new` (생성), `/samples/:id/edit` (수정)
- `props` 또는 `route.params.id`로 생성/수정 구분
  - `:id` 없음 → 생성 모드 (빈 폼)
  - `:id` 있음 → 수정 모드 (`mounted()`에서 기존 데이터 fetch 후 폼 채움)
- 필드: 제목(input), 내용(textarea), 작성자(input)
- 저장 버튼 → POST 또는 PUT → 목록(/samples) 이동

**예상 프롬프트:**

> `frontend/src/pages/SampleFormPage.vue`를 Vue 3 Options API로 만들어주세요. `route.params.id` 존재 여부로 생성/수정을 구분합니다. 생성 모드는 빈 폼을 보여주고 POST /api/samples로 전송, 수정 모드는 mounted()에서 GET /api/samples/{id}로 기존 데이터를 불러와 폼을 채우고 PUT /api/samples/{id}로 전송합니다. 저장 성공 후 /samples로 라우트 이동합니다.

---

### Step 4: 프론트엔드 — 라우터 등록 & 네비게이션

**파일:** `frontend/src/router.js`

새 경로 3개 등록:

| 경로 | 컴포넌트 | 이름 |
|------|---------|------|
| `/samples/new` | `SampleFormPage` | SampleNew |
| `/samples/:id` | `SampleDetailPage` | SampleDetail |
| `/samples/:id/edit` | `SampleFormPage` | SampleEdit |

**파일:** `frontend/src/App.vue`

- navigation에 "샘플 목록"은 이미 있음 (유지)
- 불필요한 nav 링크는 추가하지 않음 (새 글 작성은 목록 페이지에서 버튼으로)

---

### Step 5: 프론트엔드 — 목록 페이지에 버튼 추가

**파일:** `frontend/src/pages/SampleListPage.vue`

- 테이블 위 "새 글 작성" 버튼 (`router-link to="/samples/new"`)
- 테이블 행에 "상세보기" 링크/버튼 추가

---

## 3. 최종 UI 구성

### 목록 페이지 (`/samples`)
```
┌──────────────────────────────────────────────────┐
│  📋 샘플 데이터 목록           [+ 새 글 작성]     │
├──────┬────────────────────┬──────────┬──────┬─────┤
│  ID  │  제목              │  작성자   │ 날짜  │     │
├──────┼────────────────────┼──────────┼──────┼─────┤
│  1   │ 첫 번째 샘플       │ 홍길동    │ ...  │[보기]│
│  2   │ 두 번째 샘플       │ 김철수    │ ...  │[보기]│
│ ...  │ ...                │ ...      │ ...  │ ...  │
└──────┴────────────────────┴──────────┴──────┴─────┘
```

### 상세 페이지 (`/samples/1`)
```
┌──────────────────────────────────────────────┐
│  첫 번째 샘플                                 │
│                                              │
│  작성자: 홍길동  |  2026-05-26 17:55          │
│  ──────────────────────────────────────────── │
│  안녕하세요, 첫 번째 게시글입니다.              │
│                                              │
│  [목록]  [수정]  [삭제]                       │
└──────────────────────────────────────────────┘
```

### 생성/수정 폼 (`/samples/new` or `/samples/1/edit`)
```
┌──────────────────────────────────────────────┐
│  제목                                         │
│  [____________________________]               │
│  작성자                                       │
│  [____________________________]               │
│  내용                                         │
│  [____________________________]               │
│  [____________________________]               │
│                                              │
│  [저장]  [취소]                               │
└──────────────────────────────────────────────┘
```

---

## 4. 실행 순서

```
1. backend/schemas.py  — SampleCreate, SampleUpdate 추가
2. backend/routers/samples.py — POST, GET/:id, PUT/:id, DELETE/:id 구현
3. uvicorn 재시작 (자동 reload)
4. curl -X POST localhost:8000/api/samples  (API 테스트)
5. curl -X PUT localhost:8000/api/samples/1   (API 테스트)
6. curl -X DELETE localhost:8000/api/samples/1 (API 테스트)
7. frontend/src/pages/SampleDetailPage.vue 생성
8. frontend/src/pages/SampleFormPage.vue 생성
9. frontend/src/pages/SampleListPage.vue — 버튼 추가
10. frontend/src/router.js — 경로 등록
11. npm run dev → localhost:5173/samples 접속
```

---

## 5. 검증 방법

| 항목 | 방법 |
|------|------|
| 생성 | 폼 작성 후 저장 → 목록에 새 행 표시 |
| 상세 | 목록에서 "보기" 클릭 → 상세 페이지 표시 |
| 수정 | 상세에서 "수정" → 폼 수정 → 저장 → 변경 확인 |
| 삭제 | 상세에서 "삭제" → confirm 확인 → 목록에서 제거 확인 |
| API 직접 | `curl -X POST -d '{...}' localhost:8000/api/samples` |
