# SQLite + FastAPI + Vue Hello World 예제 설계

## 목표

SQLite 데이터베이스에 저장된 문자열 `'hello world'`를 Python FastAPI 백엔드가 읽고, Vue 프론트엔드가 API를 호출해 화면에 표시하는 최소 동작 예제를 만든다.

## 범위

이번 예제는 다음 범위를 포함한다.

- SQLite DB 파일 생성
- 메시지 테이블 생성과 샘플 데이터 삽입
- FastAPI에서 SQLite 데이터를 읽는 API 구현
- Vue에서 API를 호출해 화면에 문자열 출력
- 실행 방법 문서화

이번 예제는 다음 범위를 포함하지 않는다.

- 사용자 입력 폼
- CRUD 전체 기능
- 인증/권한
- 상태관리 라이브러리
- 배포 구성

## 구조

예제는 프론트엔드와 백엔드를 분리한 최소 구조로 만든다.

```text
skillDesk/
├── backend/
│   ├── main.py
│   ├── init_db.py
│   ├── requirements.txt
│   └── app.db
├── frontend/
│   ├── package.json
│   ├── vite.config.js
│   └── src/
│       ├── App.vue
│       └── main.js
└── README.md
```

## 데이터 흐름

1. `backend/init_db.py`가 SQLite 데이터베이스 파일을 만들고 `messages` 테이블을 생성한다.
2. 초기 데이터로 `'hello world'` 한 건을 삽입한다.
3. `backend/main.py`의 `GET /api/message` 엔드포인트가 SQLite에서 첫 메시지를 읽는다.
4. Vue 앱이 페이지 로드 시 `/api/message`를 호출한다.
5. 응답 JSON의 메시지를 화면에 렌더링한다.

## 백엔드 설계

### 기술 선택

- Python
- FastAPI
- sqlite3 표준 라이브러리
- uvicorn

### 엔드포인트

`GET /api/message`

응답 예시:

```json
{
  "message": "hello world"
}
```

### DB 스키마

테이블명: `messages`

컬럼:

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

### CORS

개발 중 Vue dev server에서 FastAPI API를 호출할 수 있도록 최소 CORS 설정을 추가한다.

## 프론트엔드 설계

### 기술 선택

- Vue 3
- Vite

### 동작

- 앱이 마운트되면 FastAPI API를 호출한다.
- 로딩 중에는 간단한 로딩 문구를 표시한다.
- 성공하면 DB에서 받은 `'hello world'`를 표시한다.
- 실패하면 간단한 에러 문구를 표시한다.

### 화면 구성

예제는 최소 화면만 구성한다.

- 제목
- API에서 받은 메시지 출력 영역
- 로딩/에러 상태 문구

## 실행 흐름

1. Python 가상환경 생성 및 의존성 설치
2. SQLite 초기화 스크립트 실행
3. FastAPI 서버 실행
4. Vue 의존성 설치
5. Vue 개발 서버 실행
6. 브라우저에서 메시지 표시 확인

## 검증 기준

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

- SQLite DB 파일이 생성된다.
- `messages` 테이블에 `'hello world'`가 저장된다.
- `GET /api/message` 호출 시 JSON 응답이 반환된다.
- Vue 화면에서 `'hello world'`가 보인다.
- 백엔드와 프론트엔드 실행 방법이 README에 정리된다.

## 오류 처리

최소 예제이므로 복잡한 예외 처리 대신 아래 수준만 포함한다.

- DB에 메시지가 없으면 기본 에러 응답 반환
- 프론트엔드 fetch 실패 시 에러 문구 표시

## 구현 원칙

- 예제는 최대한 짧고 이해하기 쉬워야 한다.
- 구조는 실제 앱 구조와 유사하게 분리한다.
- 과도한 추상화는 하지 않는다.
- 의존성은 최소화한다.
