일단 하고 싶은 것 → 채팅(String)을 Input으로 보내서 스트리밍 방식으로 LLM에게 응답 받기 이걸 위해서 필요한 것들에 대해 공부를 해 볼 것이다.
- 외부로부터 채팅을 입력받을 서버가 필요 = FastAPI
- 채팅 내용을 기반으로 LLM에게 질의 = LangChain ? Langgraph ?
- 응답 생성하여 리턴
FastAPI, uvicorn
FastAPI란 현대적이고 빠르며, 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 비동기 웹 프레임워크이다.
이 프레임워크로 작성된 코드를 구동하기 위해서 어떤 명령어가 필요한지 대강 살펴보면 다음과 같다.
uvicorn main:app --host 0.0.0.0 --port 8080 --reload
FastAPI 자체는 HTTP를 통해 들어온 요청을 라우팅하고 처리할 API 프레임워크이고, 클라이언트의 요청을 앞단에서 처리해서 넘겨줄 중간 계층 인터페이스가 필요한데 그 역할을 하는것이 uvicorn
Spring Boot 또한 단순 개발 프레임워크이고, 실제로 인입되는 요청을 처리하기 위해서 Embedded Tomcat이 내장되어 있듯이 비슷한 개념으로 이해하면 될 것 같다.
일단 uvicorn에 대해 이해하기 위해서 먼저 WSGI와 ASGI에 대해서 알아보자
ASGI , WSGI
- CGI (Common Gateway Interface) : 파이썬 웹앱과 웹서버 사이에 통신을 주고받기 위한 공통의 표준 인터페이스 이러한 공통 인터페이스가 없다면 웹 서버로부터의 요청을 핸들링하는 중간 계층을 언어/프레임워크 별로 개발해야 되기 때문에 매우 번거로울 것이다.
- 웹서버가 내장된 Spring Boot의 Tomcat과는 살짝 다르기는 하다. Java진영은 WAS 표준의 서블릿 컨테이너가 존재하기 때문에 별도의 인터페이스가 필요하지 않음 → Tomcat, Jetty 등에 내장되어 있음 그래서 웹서버만 거치면 바로 요청이 들어올 수 있는 것이다.

파이썬 계열의 Gateway Interface의 변화 과정에 대해서 더 자세한 내용을 원한다면 여기 링크를 보는게 좋을 듯 하다 : https://velog.io/@hwaya2828/WSGI-ASGI
정리하면 다음과 같음
- WSGI는 웹 서버와 애플리케이션 사이에 미들웨어 역할을 하며 기술적으로는 웹 서버도 WSGI에 대한 작동 코드가 필요하고, 애플리케이션 또한 WSGI에 대한 작동 코드가 필요한 Client-Server Model을 응용한 것
| ASGI | WSGI | |
| 구현체 | uvicorn | gunicorn |
| 지원 방식 | 비동기, 웹소켓 등 지원 | 동기 방식만 지원 |
| 프레임워크 | FastAPI | Django, Flask |
실제 프로덕션 환경에서는 gunicorn을 이용해 멀티 프로세스를 띄우고 uvicorn worker를 실행하는 방식으로 많이 사용한다고 함
// worker 4개로 실행, worker class로 uvicorn.workers.UvicornWorker 클래스 지정
gunicorn main:app --workers 4 --worker-class \\
uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
- Uvicorn = ASGI 서버 (요청 처리 엔진)
- Gunicorn = 프로세스 매니저 (워커 관리 & 로드밸런싱), 마스터 프로세스 역할
- uvicorn만 사용 시 재시작이나 graceful shutdown 등 안정적인 프로세스 관리가 어렵기 때문 (k8s와 같은 분산 시스템에서는 멀티프로세스 환경에서도 uvicorn만 사용하기도 함)
지금은 단일 FastAPI 프로세스로 구동하여 테스트 할 것이기 때문에 uvicorn만 사용하여 테스트해볼 예정
서버를 구동해보자
python -m venv myenv
source myenv/bin/activate
pip install "fastapi[all]"
main.py
from fastapi import FastAPI
app = FastAPI()
class DataInput(BaseModel):
prompt: str
# GET요청
@app.get("/")
def main():
return "hello"
# POST요청 - RequestBody
@app.post("/test")
def prompt_test(asd: DataInput):
return {"msg": asd.prompt}
# POST요청 - queryString
@app.post("/test2")
def prompt_test(asd: string):
return {"msg": asd}
uvicorn main:app

FastAPI는 기본적으로 Swagger UI를 지원한다. (/docs)

'AI' 카테고리의 다른 글
| Ollama로 로컬에 LLM API 띄우기 (0) | 2026.01.06 |
|---|---|
| FastAPI, LLM 연동하기 (2) - FastAPI 사용 가이드 (0) | 2025.10.14 |
| MCP & A2A (0) | 2025.10.14 |