본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

FastAPI 문서
FastAPI
FastAPI 시작하기프로젝트 구조핵심 개념데이터와 상태테스트배포
토론

FastAPI 안내서 · 2/6

프로젝트 구조

FastAPI는 폴더 구조를 강제하지 않습니다. 파일 하나로 시작해도 되지만, 엔드포인트가 늘어나면 기능별로 파일을 나누는 것이 좋습니다. 이 장에서는 공식 문서의 "Bigger Applications" 예제를 바탕으로 흔히 쓰는 구조와 라우터, 설정 파일, 관례를 살펴봅니다.

권장하는 폴더 구조

hello-fastapi/
├── app/
│   ├── __init__.py
│   ├── main.py          # FastAPI() 생성, 라우터 등록
│   ├── dependencies.py  # 여러 곳에서 쓰는 의존성
│   ├── config.py        # 설정(pydantic-settings)
│   ├── models.py        # Pydantic · SQLModel 모델
│   └── routers/
│       ├── __init__.py
│       ├── items.py
│       └── users.py
├── tests/
│   └── test_items.py
├── .env                 # 로컬 환경 변수(커밋하지 않음)
├── pyproject.toml       # 또는 requirements.txt
└── Dockerfile

app 폴더는 하나의 Python 패키지이며, 모든 폴더에 __init__.py를 두어 from app.routers import items 같은 가져오기가 동작하게 합니다. 이 경우 개발 서버는 fastapi dev app/main.py로 실행합니다. fastapi 명령은 파일 경로를 보고 패키지 구조를 파악해 app 객체를 찾아 줍니다.

APIRouter로 경로 나누기

APIRouter는 작은 FastAPI 앱처럼 동작합니다. 기능마다 라우터를 만들고, 공통 접두 경로와 문서용 태그를 한 번에 지정할 수 있습니다.

# app/routers/items.py
from fastapi import APIRouter, HTTPException

router = APIRouter(prefix="/items", tags=["items"])

fake_items = {"plumbus": {"name": "Plumbus"}, "gun": {"name": "Portal Gun"}}


@router.get("/")
def list_items():
    return fake_items


@router.get("/{item_id}")
def read_item(item_id: str):
    if item_id not in fake_items:
        raise HTTPException(status_code=404, detail="Item not found")
    return fake_items[item_id]

main.py에서는 앱을 만들고 라우터를 등록하기만 합니다. 이렇게 하면 진입점이 짧게 유지되고, 각 기능의 코드는 자기 파일 안에 모입니다.

# app/main.py
from fastapi import FastAPI

from app.routers import items, users

app = FastAPI(title="Hello FastAPI", version="0.1.0")

app.include_router(items.router)
app.include_router(users.router)


@app.get("/health")
def health():
    return {"status": "ok"}

include_router에도 prefix, tags, dependencies를 넘길 수 있어서, 같은 라우터를 /api/v1 아래에 붙이거나 관리자 라우터 전체에 인증 의존성을 거는 식으로 활용할 수 있습니다.

의존성 파일

여러 라우터가 함께 쓰는 의존성은 dependencies.py에 모읍니다. 아래는 요청 헤더의 토큰을 확인하는 간단한 예입니다.

# app/dependencies.py
from typing import Annotated

from fastapi import Header, HTTPException


async def verify_token(x_token: Annotated[str, Header()]):
    if x_token != "secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")

라우터를 만들 때 APIRouter(dependencies=[Depends(verify_token)])처럼 넘기면 그 라우터의 모든 경로에 적용됩니다. 매개변수 이름 x_token은 자동으로 x-token 헤더로 바뀝니다.

의존성과 설정 파일

의존성은 보통 pyproject.toml에 적습니다. uv, Poetry, Hatch 같은 도구가 이 파일을 읽어 가상 환경을 관리합니다. pip만 쓴다면 requirements.txt도 충분합니다.

[project]
name = "hello-fastapi"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = [
    "fastapi[standard]",
    "sqlmodel",
    "pydantic-settings",
]

[dependency-groups]
dev = ["pytest", "ruff"]

데이터베이스 주소나 비밀 키 같은 값은 코드에 쓰지 않고 환경 변수나 .env 파일로 넘깁니다. .env는 .gitignore에 넣고, 필요한 변수 이름만 적은 .env.example을 저장소에 둡니다. 설정을 읽는 방법은 4장에서 다룹니다.

앱 시작과 종료 처리

데이터베이스 연결 풀이나 머신러닝 모델처럼 앱이 시작할 때 한 번 준비하고 끝날 때 정리해야 하는 자원은 lifespan으로 다룹니다.

from contextlib import asynccontextmanager

from fastapi import FastAPI


@asynccontextmanager
async def lifespan(app: FastAPI):
    print("starting up")   # 연결 준비, 모델 불러오기
    yield
    print("shutting down")  # 자원 정리


app = FastAPI(lifespan=lifespan)

yield 앞의 코드는 첫 요청을 받기 전에, 뒤의 코드는 서버가 멈출 때 실행됩니다.

관례

항목관례
진입점app/main.py의 app 변수
라우터기능별 파일, router = APIRouter(prefix=..., tags=[...])
모델입력용 · 출력용 모델을 나눔(ItemCreate, ItemPublic)
테스트tests/test_*.py, pytest로 실행
비밀 값환경 변수 또는 .env, 저장소에 넣지 않음

정리

  • 처음에는 main.py 하나로 시작하고, 커지면 app 패키지와 routers 폴더로 나눕니다.
  • APIRouter로 기능별 경로를 묶고 app.include_router로 등록합니다.
  • 공통 의존성은 dependencies.py, 설정은 환경 변수와 .env로 관리합니다.
  • 시작과 종료 때의 자원 관리는 lifespan으로 처리합니다.
이 장에 대해 질문이 있나요?
이전 장FastAPI 시작하기다음 장핵심 개념

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.