프로젝트가 처음인 팀원을 기준으로, 이 저장소를 어떻게 읽고 실행하면 되는지 차근차근 설명하는 안내서입니다.
이 문서는 uv 방식만 다룹니다. 이 저장소 안에는 다른 실험 폴더도 있지만, 지금부터는 uv-based-fastapi만 본다고 생각하면 됩니다.
이 저장소는 FastAPI의 가장 기본적인 흐름을 직접 만져 보기 위한 예제입니다.
이 예제를 통해 아래 순서를 익힐 수 있습니다.
- Python 프로젝트를 만든다.
uv로 필요한 패키지를 설치한다.- FastAPI 서버를 실행한다.
- URL로 API를 호출해 본다.
- 라우터를 파일별로 나눠 본다.
- MySQL과 연결해 데이터를 조회해 본다.
즉, "웹 서버가 어떻게 켜지고", "API 파일이 어떻게 나뉘고", "DB에서 데이터를 어떻게 읽어 오는지"를 한 번에 경험하는 저장소입니다.
가장 먼저 볼 폴더는 아래입니다.
uv-based-fastapi/example
이 폴더가 실제로 실행하는 FastAPI 예제 프로젝트입니다.
루트에서 중요한 경로는 아래 정도만 먼저 기억하면 충분합니다.
uv-based-fastapi/README.md현재uv버전 예제의 작업 메모입니다.uv-based-fastapi/example/main.py서버를 실행하는 시작 파일입니다.uv-based-fastapi/example/app.pyFastAPI 앱과 라우터를 등록하는 파일입니다.uv-based-fastapi/example/controller/API 주소별로 기능을 나눈 폴더입니다.uv-based-fastapi/example/model/mysql_test.pyMySQL 조회 코드가 들어 있는 파일입니다.uv-based-fastapi/example/config/config.py포트와 DB 접속 설정이 들어 있는 파일입니다.uv-based-fastapi/example/main_request.pyrequests패키지 테스트용 예제 파일입니다.
현재 기준 주요 구조는 아래와 같습니다.
FastAPI/
├─ README.md
├─ test_db.bak
├─ uv-based-fastapi/
│ ├─ README.md
│ ├─ prompts/
│ │ └─ update-root-readme-from-project-status.md
│ └─ example/
│ ├─ README.md
│ ├─ app.py
│ ├─ main.py
│ ├─ main_request.py
│ ├─ pyproject.toml
│ ├─ uv.lock
│ ├─ config/
│ │ └─ config.py
│ ├─ controller/
│ │ ├─ admins.py
│ │ ├─ items.py
│ │ └─ users.py
│ └─ model/
│ └─ mysql_test.py
└─ pip-based-fastapi/
여기서 초보자가 꼭 알아야 할 핵심은 아래입니다.
main.py는 "서버를 실행하는 파일"입니다.app.py는 "FastAPI 앱을 만드는 파일"입니다.controller폴더는 "URL별 기능을 나누는 곳"입니다.model폴더는 "DB 접근 코드를 두는 곳"입니다.config.py는 "설정값을 모아 두는 곳"입니다.
이 예제는 현재 코드 기준으로 아래 패키지를 사용합니다.
fastapiuvicornrequestsmysql-connector-python
uv-based-fastapi/example/pyproject.toml에 실제 의존성이 적혀 있습니다.
현재 설정은 아래와 같습니다.
- Python 버전 조건:
>=3.14 - 서버 호스트:
127.0.0.1 - 서버 포트:
8080 - 자동 재시작:
reload=True
uv는 Python 패키지 설치, 가상환경 관리, 실행을 빠르게 도와주는 도구입니다.
예전에는 아래처럼 따로따로 많이 했습니다.
- 가상환경 만들기
- 가상환경 활성화하기
pip install하기python main.py실행하기
uv를 쓰면 이 과정을 더 단순하게 가져갈 수 있습니다.
이 저장소는 그 uv 방식으로 정리되어 있습니다.
터미널에서 아래 명령으로 uv가 설치되어 있는지 확인합니다.
uv --version버전이 보이면 다음 단계로 가면 됩니다.
만약 설치가 안 되어 있다면, 팀에서 사용하는 표준 설치 방법으로 먼저 uv를 설치해야 합니다.
cd uv-based-fastapi\example이제부터 대부분의 명령은 이 폴더에서 실행합니다.
pyproject.toml에 적혀 있는 패키지를 기준으로 환경을 맞춥니다.
uv sync이 명령은 현재 프로젝트에 필요한 패키지를 설치하고, 잠금 파일인 uv.lock 기준으로 환경을 맞추는 데 사용합니다.
main.py가 서버 실행 진입점입니다.
uv run main.py이 명령이 하는 일은 아래와 같습니다.
main.py를 실행합니다.main.py안에서uvicorn.run(...)을 호출합니다.app="app:app"설정을 보고app.py의app객체를 찾습니다.- FastAPI 서버가
127.0.0.1:8080에서 실행됩니다.
실제 코드 흐름은 대략 이렇게 읽으면 됩니다.
import uvicorn
from config import config
def main():
uvicorn.run(
app="app:app",
host="127.0.0.1",
port=config.PORT,
reload=True,
)여기서 중요한 포인트는 아래입니다.
app="app:app"app.py파일 안의app객체를 사용한다는 뜻입니다.host="127.0.0.1"내 컴퓨터에서만 접속 가능한 로컬 주소입니다.port=config.PORT포트 번호는 설정 파일에서 가져옵니다.reload=True코드를 저장하면 서버가 자동으로 다시 시작됩니다.
서버가 켜지면 아래 주소들을 열어 볼 수 있습니다.
http://127.0.0.1:8080/http://127.0.0.1:8080/items/1http://127.0.0.1:8080/items/1?q=testhttp://127.0.0.1:8080/users/1http://127.0.0.1:8080/docs
각 주소의 의미는 아래와 같습니다.
/가장 기본적인 루트 주소입니다./items/1경로 파라미터를 받는 예제입니다./items/1?q=test경로 파라미터와 쿼리스트링을 함께 받는 예제입니다./users/1다른 라우터 파일로 분리된 API 예제입니다./docsFastAPI가 자동으로 만들어 주는 Swagger UI 문서입니다.
초보자라면 특히 /docs를 꼭 열어 보세요.
코드를 다 읽지 않아도 어떤 API가 있는지 버튼으로 확인할 수 있어서 이해가 훨씬 쉬워집니다.
app.py는 FastAPI 앱을 만들고, 각 라우터를 등록하는 파일입니다.
현재 코드는 아래 구조입니다.
from fastapi import FastAPI
from controller import items, users, admins
app = FastAPI()
app.include_router(items.router)
app.include_router(users.router)
app.include_router(admins.router)
@app.get("/")
def read_root():
return {"Hello": "World"}이 파일을 읽을 때는 아래 순서로 이해하면 됩니다.
app = FastAPI()로 앱을 만듭니다.include_router(...)로 기능별 라우터를 붙입니다./주소용 간단한 API도 직접 하나 만듭니다.
프로젝트가 커지면 main.py나 app.py 한 파일에 모든 API를 몰아넣기 어렵습니다.
그래서 주소별로 파일을 나눕니다.
현재는 아래처럼 나뉘어 있습니다.
controller/items.pycontroller/users.pycontroller/admins.py
/items/{item_id} 주소를 담당합니다.
@router.get("/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}여기서 배우면 좋은 개념은 아래입니다.
item_id: int주소에 들어오는 값을 정수로 받겠다는 뜻입니다.q선택적으로 받는 쿼리스트링입니다.
예를 들어 아래처럼 호출할 수 있습니다.
/items/1
/items/1?q=test
/users/{user_id} 주소를 담당합니다.
@router.get("/{user_id}")
def read_user(user_id: int):
return {"user_id": user_id}이 파일은 가장 단순한 라우터 예제라고 보면 됩니다.
main_request.py는 FastAPI 서버를 띄우는 파일이 아닙니다.
이 파일은 Python 코드에서 외부 HTTP 요청을 보내는 아주 간단한 예제입니다.
실행은 아래처럼 합니다.
uv run main_request.py현재 코드는 Python 공식 문서 쪽 API에 요청을 보내고, JSON 응답을 출력합니다.
import requests
def main():
resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
print(data)즉, 이 파일은 "HTTP 요청을 보내는 코드가 이런 느낌이구나"를 보기 위한 별도 예제입니다.
이 저장소에는 DB 연결 예제도 들어 있습니다.
현재는 MySQL 기준입니다.
먼저 설정 파일을 보면 아래와 같습니다.
PORT = 8080
MYSQL_DB_CONFIG = {
"host": "127.0.0.1",
"database": "test_db",
"user": "test_user",
"password": "0000",
}이 파일은 크게 두 가지를 관리합니다.
- FastAPI 서버 포트
- MySQL 접속 정보
이 파일은 실제 DB에 접속해 저장 프로시저를 호출합니다.
현재 로직은 아래 흐름입니다.
config.py에서 DB 접속 정보를 가져옵니다.- MySQL에 연결합니다.
SP_L_ADMIN저장 프로시저를 호출합니다.- 결과를 리스트로 모아서 반환합니다.
즉, 지금 코드는 단순 SELECT가 아니라 저장 프로시저 기반 예제입니다.
아래 조건이 맞아야 /admins/... 쪽이 동작합니다.
- 로컬 MySQL 서버가 실행 중이어야 합니다.
test_db데이터베이스가 있어야 합니다.test_user / 0000계정이 있어야 합니다.TB_ADMIN테이블이 있어야 합니다.SP_L_ADMIN저장 프로시저가 있어야 합니다.
저장소 루트에는 test_db.bak 파일도 있습니다.
이 파일은 DB 백업 관련 실습 흔적으로 보며, 필요할 때 참고할 수 있습니다.
현재 controller/admins.py는 아래처럼 되어 있습니다.
@router.get("/{list}")
def list_admin():
results = mysql_test.list_admin()
return results여기서 초보자도 꼭 알아야 할 점이 있습니다.
- URL 경로에는
/{list}가 선언되어 있습니다. - 그런데 함수
list_admin()은list값을 인자로 받지 않습니다.
즉, 현재 코드는 "주소 형식"과 "함수 매개변수"가 깔끔하게 맞아 떨어지는 상태는 아닙니다.
그래서 /admins/test 같은 주소는 문서상 예시로는 볼 수 있지만, 실제 프로젝트에서는 이 부분을 나중에 정리하는 것이 좋습니다.
이 README는 현재 코드를 숨기지 않고 그대로 설명하기 위해 이 상태를 그대로 적었습니다.
처음 보는 팀원이라면 아래 순서가 가장 이해하기 쉽습니다.
uv-based-fastapi/example/main.py서버를 어떻게 켜는지 먼저 봅니다.uv-based-fastapi/example/app.pyFastAPI 앱과 라우터 연결 구조를 봅니다.uv-based-fastapi/example/controller/items.py가장 쉬운 API 예제를 봅니다.uv-based-fastapi/example/controller/users.py라우터를 하나 더 추가한 예제를 봅니다.- 브라우저에서
/docs코드와 실제 API 화면을 연결해서 이해합니다. uv-based-fastapi/example/config/config.py설정 파일의 역할을 봅니다.uv-based-fastapi/example/model/mysql_test.pyDB 연결은 마지막에 봅니다.
처음부터 DB 코드까지 한 번에 이해하려고 하면 부담이 큽니다.
먼저 "서버 실행 -> 라우터 이해 -> API 호출 확인"까지 익힌 뒤에 DB 쪽으로 넘어가는 것이 좋습니다.
프로젝트 폴더 이동:
cd uv-based-fastapi\example의존성 설치:
uv sync서버 실행:
uv run main.py요청 테스트 파일 실행:
uv run main_request.py- 이 저장소는
uv기준으로 보는 것이 가장 자연스럽습니다. - 실제 실행 프로젝트는
uv-based-fastapi/example입니다. example/README.md는 현재 비어 있습니다.pyproject.toml의readme = "README.md"는 비어 있는example/README.md를 가리키고 있습니다./admins/{list}라우터는 경로 선언과 함수 시그니처가 완전히 맞지 않습니다.- DB 예제는 MySQL과 저장 프로시저 준비가 끝나야 정상 동작합니다.
- Python 버전 조건이
>=3.14로 잡혀 있으므로, 실행 환경 버전을 먼저 확인하는 것이 좋습니다.
서버가 안 켜지면 아래 순서로 보면 됩니다.
uv-based-fastapi/example폴더 안에서 명령을 실행했는지 확인uv sync를 했는지 확인uv --version이 되는지 확인config/config.py의 포트가8080인지 확인- 실행 명령을
uv run main.py로 쳤는지 확인
/admins가 안 되면 아래를 확인하면 됩니다.
- MySQL 서버가 켜져 있는지
- 접속 정보가
config.py와 맞는지 test_db와TB_ADMIN이 있는지SP_L_ADMIN저장 프로시저가 있는지
이 저장소는 uv-based-fastapi/example 폴더를 중심으로 FastAPI의 기본 실행, 라우터 분리, 그리고 MySQL 연동까지 연습하는 입문용 예제입니다.