# SQLite + FastAPI + Vue CRUD 예제 설계

## 목표

기존의 단일 `'hello world'` 조회 예제를 확장해, SQLite에 저장된 메시지를 Vue 화면에서 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)할 수 있는 목록형 CRUD 예제로 만든다.

## 범위

이번 작업은 다음을 포함한다.

- SQLite `messages` 테이블 유지
- 메시지 목록 조회 API 추가
- 메시지 생성 API 추가
- 메시지 수정 API 추가
- 메시지 삭제 API 추가
- Vue 화면에서 목록형 CRUD UI 구현
- 초기 데이터로 `hello world` 1건 유지
- 실행 문서 업데이트

이번 작업은 다음을 포함하지 않는다.

- 인증/권한
- 검색/정렬/페이지네이션
- 다중 테이블 관계
- 복잡한 폼 검증
- 배포 설정

## 구조

기존 분리형 구조를 그대로 유지한다.

```text
skillDesk/
├── backend/
│   ├── init_db.py
│   ├── main.py
│   ├── requirements.txt
│   └── app.db
├── frontend/
│   ├── index.html
│   └── src/
│       └── main.js
└── README.md
```

## 데이터 모델

테이블명: `messages`

컬럼:

- `id` INTEGER PRIMARY KEY AUTOINCREMENT
- `content` TEXT NOT NULL

메시지 단위는 매우 단순하게 유지한다. 별도 제목, 작성일, 상태 컬럼은 추가하지 않는다.

## API 설계

### 1. 목록 조회

`GET /api/messages`

응답 예시:

```json
[
  { "id": 1, "content": "hello world" }
]
```

### 2. 생성

`POST /api/messages`

요청 예시:

```json
{
  "content": "new message"
}
```

응답 예시:

```json
{
  "id": 2,
  "content": "new message"
}
```

### 3. 수정

`PUT /api/messages/{id}`

요청 예시:

```json
{
  "content": "updated message"
}
```

응답 예시:

```json
{
  "id": 1,
  "content": "updated message"
}
```

### 4. 삭제

`DELETE /api/messages/{id}`

응답 예시:

```json
{
  "success": true
}
```

## 백엔드 설계

- FastAPI는 기존 CORS 설정을 유지한다.
- sqlite3 표준 라이브러리를 사용한다.
- 입력 모델은 최소한으로 `content` 문자열만 받는다.
- 빈 문자열은 거부한다.
- 존재하지 않는 id에 대한 수정/삭제는 404로 반환한다.

## 프론트엔드 설계

### 화면 구성

- 상단 제목과 설명
- 새 메시지 입력 폼
- 메시지 목록 영역
- 각 항목의 수정 / 삭제 버튼
- 수정 모드일 때 인라인 입력창과 저장 / 취소 버튼
- 로딩 / 에러 / 빈 목록 상태 표시

### 사용자 흐름

1. 페이지 진입 시 목록을 불러온다.
2. 입력창에 값을 넣고 생성 버튼을 누르면 메시지가 추가된다.
3. 각 항목의 수정 버튼을 누르면 해당 줄이 편집 모드로 바뀐다.
4. 저장 시 수정 API를 호출하고 목록을 갱신한다.
5. 삭제 시 삭제 API를 호출하고 목록을 갱신한다.

### 상태

다음 상태를 최소로 둔다.

- 전체 목록
- 새 메시지 입력값
- 현재 편집 중인 메시지 id
- 편집 중 입력값
- 로딩 상태
- 에러 상태

## 데이터 흐름

1. `init_db.py`가 DB를 만들고 `hello world`를 기본 데이터로 넣는다.
2. Vue는 페이지 로드 시 `GET /api/messages`를 호출한다.
3. 사용자가 생성/수정/삭제를 수행하면 해당 API를 호출한다.
4. 요청 성공 후 목록을 다시 불러오거나 로컬 상태를 갱신한다.

## 오류 처리

- 빈 메시지 생성/수정은 프론트엔드와 백엔드 모두에서 막는다.
- 없는 메시지 수정/삭제는 404로 처리한다.
- API 실패 시 화면에 간단한 오류 문구를 표시한다.

## 검증 기준

다음 조건을 만족하면 성공이다.

- 초기 화면에 `hello world`가 포함된 목록이 표시된다.
- 새 메시지를 추가할 수 있다.
- 기존 메시지를 수정할 수 있다.
- 기존 메시지를 삭제할 수 있다.
- 삭제 후 목록이 즉시 반영된다.
- README 실행 방법이 최신 흐름에 맞게 정리된다.

## 구현 원칙

- 기존 예제 구조를 최대한 유지한다.
- 불필요한 라이브러리는 추가하지 않는다.
- CRUD 흐름이 한눈에 보이는 최소 UI를 만든다.
- 과도한 추상화보다 이해하기 쉬운 코드를 우선한다.
