# [수업 자료] FastAPI 첫 걸음: 간단한 채팅 프로그램 만들기

이 자료는 FastAPI를 사용하여 기본적인 클라이언트-서버 구조의 채팅 프로그램을 이해하기 위한 설명서입니다. PPT 제작 시 각 섹션을 슬라이드로 활용할 수 있도록 구성되었습니다.

---

## Slide 1: 프로젝트 개요
### "FastAPI로 만드는 나만의 채팅 서버"
- **목표**: Python의 현대적인 웹 프레임워크인 FastAPI를 이용해 메시지를 주고받는 서버와 클라이언트를 구현합니다.
- **핵심 기술**:
  - **FastAPI**: 빠르고 생산적인 Python 웹 프레임워크
  - **Uvicorn**: ASGI 서버로 FastAPI 앱을 실행
  - **Pydantic**: 데이터 검증 및 설정을 위한 라이브러리
  - **Requests**: Python에서 HTTP 요청을 보내는 라이브러리

---

## Slide 2: 전체 구조 (Architecture)
### "누가 무엇을 하나요?"

![채팅 프로그램 전체 구조](./assets/architecture.png)

- **서버 (Server - `server.py`)**:
  - 메시지를 저장하는 장소 (메모리 내 리스트)
  - 클라이언트의 요청을 기다리고 처리함 (API 제공)
  - 메시지에 '언제' 보냈는지 시간을 기록함
- **클라이언트 (Client - `client.py`)**:
  - 사용자와 직접 소통하는 화면 (터미널)
  - 서버에 메시지를 보내거나(POST), 새로운 메시지를 가져옴(GET)

---

## Slide 3: 데이터의 약속 (JSON & Model)
### "서버와 클라이언트는 어떻게 대화하나요?"
- **데이터 형식 (JSON)**:
  ```json
  {
    "name": "고도푸",
    "message": "안녕하세요!"
  }
  ```
- **데이터 모델 (Pydantic)**:
  - 서버는 어떤 데이터가 들어올지 미리 정의합니다.
  - `name`과 `message`가 문자열(str)인지 자동으로 검사합니다.

---

## Slide 4: 메시지 전송 (POST Request)
### "서버로 메시지 보내기"

![메시지 전송 및 수신 흐름](./assets/flow.png)

1. 사용자가 내용을 입력합니다.
2. 클라이언트가 서버의 `/messages` 주소로 데이터를 실어 보냅니다. (POST)
3. 서버는 현재 시간을 계산하여 메시지와 함께 저장합니다.
   - **서버 로직**: `datetime.now().strftime(...)`를 사용하여 친숙한 시간 형식으로 변환

---

## Slide 5: 메시지 확인 (GET Request & Polling)
### "새로운 메시지 가져오기"
- **효율적인 조회**: 모든 메시지를 매번 다 가져오는 것은 비효율적입니다.
- **인덱스 활용 (`start` 파라미터)**:
  - 클라이언트는 "내가 5번까지 봤으니, 6번부터 줘!"라고 요청합니다.
  - 예: `/messages?start=5`
- **결과**: 클라이언트는 아직 보지 못한 '새 소식'만 화면에 출력합니다.

---

## Slide 6: 실습 흐름 (Workflow)
### "직접 실행해 봅시다!"
1. **서버 실행**: `python server.py` (비서가 전화를 기다리는 상태)
2. **클라이언트 실행**: `python client.py` (사용자가 대화를 시작)
3. **상호작용**:
   - 1번 선택: 메시지 작성 및 전송
   - 2번 선택: 새 메시지 확인 (다른 사람이 보낸 것도 보임!)
   - 3번 선택: 종료

---

## Slide 7: 요약 및 발전 방향
### "무엇을 배웠나요?"
- **HTTP Method**: 데이터를 보낼 때는 POST, 가져올 때는 GET을 사용합니다.
- **Stateless**: 서버는 클라이언트가 누구인지 기억하지 않지만, 요청에 따라 데이터를 관리합니다.
- **Next Step**:
  - 데이터베이스(DB) 연결하여 재시작해도 대화 유지하기
  - 웹 브라우저 화면(HTML/CSS)으로 예쁘게 만들기
  - 실시간 통신(WebSocket) 적용해보기
