# 12. FastAPI 웹 + Python AI 챗봇 연동 (스프링부트에 가장 근접 + 간결)

Flask 와 FastAPI 중 **스프링부트의 아키텍처에 더 가까운 쪽은 FastAPI** 다:
타입 기반 요청 스키마(Pydantic = DTO), 데코레이터 라우팅, 의존성 주입, 자동 API 문서(`/docs`).
구조는 스프링과 닮았는데 코드량은 훨씬 적다.

```
[브라우저] --/api/chat--> [FastAPI :8000] --/chat--> [Python AI :5000] --> OpenAI
```

## 구성
```
12_fastapi_chatbot/
├─ main.py                       /api/chat (Pydantic 스키마) → Python AI 로 전달 + 정적 서빙
├─ requirements.txt              fastapi, uvicorn, httpx
├─ static/{index.html, app.js}   채팅 화면
└─ python_ai/ai_server.py        공통 AI 서비스 (10·11 과 동일)
```

## 실행 (터미널 2개)
```bash
# ① Python AI 서비스 (먼저)
cd python_ai && python ai_server.py          # http://localhost:5000

# ② FastAPI 웹
pip install -r requirements.txt              # 최초 1회
uvicorn main:app --port 8000 --reload        # http://localhost:8000
#   자동 API 문서: http://localhost:8000/docs
```

## 비교 포인트 (10 vs 11 vs 12) — 같은 일을 하는 웹 티어 핵심 코드

**Spring Boot (Java)** — 클래스 + 어노테이션 + RestClient + 타입 캐스팅, 별도 pom.xml/빌드:
```java
@RestController
public class ChatController {
    private final RestClient rest = RestClient.create();
    @PostMapping("/api/chat")
    public Map<String,Object> chat(@RequestBody Map<String,String> body) {
        Map<?,?> ai = rest.post().uri("http://localhost:5000/chat")
            .body(Map.of("message", body.get("message"))).retrieve().body(Map.class);
        return Map.of("reply", ai.get("reply"));
    }
}
```

**Node.js (Express)** — 라우트 함수 + 내장 fetch:
```js
app.post('/api/chat', async (req, res) => {
  const r = await fetch('http://localhost:5000/chat', { method:'POST',
    headers:{'Content-Type':'application/json'}, body: JSON.stringify({message: req.body.message}) });
  res.json({ reply: (await r.json()).reply });
});
```

**FastAPI (Python)** — 타입 스키마 + async, 스프링과 닮았지만 가장 짧다:
```python
class ChatRequest(BaseModel):
    message: str

@app.post("/api/chat")
async def chat(req: ChatRequest):
    async with httpx.AsyncClient() as client:
        r = await client.post("http://localhost:5000/chat", json={"message": req.message})
    return {"reply": r.json()["reply"]}
```

> 결론: 스프링부트의 '구조적 장점(타입·DTO·문서화)'은 FastAPI 가 거의 그대로 가지면서도,
> 보일러플레이트는 Node.js 만큼 가볍다. AI 백엔드(Python)와 같은 언어라 운영도 단순해진다.
