2026๋…„ 7์›” 21์ผ ํ™”์š”์ผ

# ๐Ÿ“‚ FastAPI CRUD ํ‘œ์ค€ ํด๋” ๊ตฌ์กฐ (my-api/ ๋‚ด๋ถ€)




```bash

# ๐Ÿ“‚ FastAPI CRUD ํ‘œ์ค€ ํด๋” ๊ตฌ์กฐ (my-api/ ๋‚ด๋ถ€)
my-api/                        # ๐Ÿ“ฆ ํŒŒ์ด์ฌ ๋ฐฑ์—”๋“œ ๋…๋ฆฝ ํด๋”
├── .vscode/
│   └── settings.json          # ๐Ÿ’ก ๊ฐ€์ƒํ™˜๊ฒฝ ๊ณ ์ • ์„ธํŒ… (./.venv/bin/python)
├── .venv/                     # ๐Ÿ’ก ์ด ํด๋”๋งŒ์„ ์œ„ํ•œ ๋…๋ฆฝ ๊ฐ€์ƒํ™˜๊ฒฝ
├── app/                       # ๐Ÿš€ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์ฝ”๋“œ ํด๋”
│   ├── __init__.py
│   ├── main.py                # ์„œ๋ฒ„ ์ง„์ž…์  (FastAPI ์ธ์Šคํ„ด์Šค, ๋ฏธ๋“ค์›จ์–ด ์„ค์ •)
│   │
│   ├── config.py              # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ DB ์—ฐ๊ฒฐ ์„ค์ • (Pydantic Settings)
│   ├── database.py            # SQLAlchemy DB ์„ธ์…˜ ์„ค์ • (SessionLocal)
│   │
│   ├── api/                   # [Router] URL ๊ฒฝ๋กœ ๋ฐ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ
│   │   ├── __init__.py
│   │   └── v1/
│   │       ├── __init__.py
│   │       └── table.py       # ๐Ÿ’ก ๋งจ ์ฒ˜์Œ ๊ธฐํšํ•œ HTMX ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ผ์šฐํ„ฐ ์œ„์น˜
│   │
│   ├── crud/                  # [Repository/CRUD] ์ˆœ์ˆ˜ DB ์ฟผ๋ฆฌ (Select, Insert)
│   │   ├── __init__.py
│   │   └── base.py            # ๊ณตํ†ต CRUD ์ฟผ๋ฆฌ (์กฐํšŒ, ์ƒ์„ฑ, ์‚ญ์ œ, ์ˆ˜์ • ๊ณตํ†ตํ™”)
│   │
│   ├── models/                # [DB Model] SQLAlchemy ํ…Œ์ด๋ธ” ์ •์˜
│   │   ├── __init__.py
│   │   └── table_data.py      # ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ
│   │
│   └── schemas/               # [DTO] Pydantic ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๊ทœ๊ฒฉ
│       ├── __init__.py
│       └── table_data.py      # Request/Response Validation์šฉ ์Šคํ‚ค๋งˆ
│
├── public/                    # ๐ŸŽจ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ์ •์  ํŒŒ์ผ ๋ณด๊ด€์†Œ
│   └── favicon.ico            # ํŒŒ๋น„์ฝ˜ ์•„์ด์ฝ˜ ํŒŒ์ผ
├── logs/                      # ๐Ÿ“‚ ๋ฐฑ์—”๋“œ ์˜๊ตฌ ๋ณด๊ด€ ๋กœ๊ทธ ํด๋”
│   └── access.log             # User-Agent๊ฐ€ ํฌํ•จ๋œ ์•„ํŒŒ์น˜ ํฌ๋งท ๋กœ๊ทธ ํŒŒ์ผ
├── pyproject.toml             # uv ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฐ Ruff ์ตœ์ ํ™” ์„ค์ • ํŒŒ์ผ
└── README.md                  # ํ”„๋กœ์ ํŠธ ์„ค๋ช…์„œ

app/
└── domains/
    ├── packet/
    │   ├── __init__.py
    │   ├── router.py
    │   ├── crud.py
    │   └── models.py      # ๐Ÿงฑ ์˜ค์ง '๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๋ฐ์ดํ„ฐ'๋งŒ ์„ค๊ณ„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด ์„ ์–ธ์„œ
    │
    └── user/
        ├── __init__.py
        ├── router.py
        ├── crud.py
        └── models.py      # ๐Ÿงฑ ์˜ค์ง 'ํšŒ์› ์ •๋ณด/๋น„๋ฐ€๋ฒˆํ˜ธ'๋งŒ ์„ค๊ณ„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด ์„ ์–ธ์„œ

app/
└── domains/
    └── packet/
        ├── __init__.py
        ├── router.py       # ๐Ÿ‘ฎ‍♂️ View / API ์ฃผ์†Œ์ฐฝ ์ œ์–ด์‹ค
        ├── crud.py         # ๐Ÿ—„️ ์ˆœ์ˆ˜ DB ์ฟผ๋ฆฌ ์ „์šฉ ํ•จ์ˆ˜ ๋ณด๊ด€์†Œ
        ├── models.py       # ๐Ÿงฑ SQLite DB ํ…Œ์ด๋ธ” ๋ฌผ๋ฆฌ ์„ค๊ณ„๋„ (SQLAlchemy)
        ├── schemas.py      # ๐Ÿ“ [์—ฌ๊ธฐ์— ์žฅ์ฐฉ!] ํŒจํ‚ท ๋ฐ์ดํ„ฐ ์ž…๋ ฅ๊ฐ’/์ถœ๋ ฅ๊ฐ’ ๊ทœ๊ฒฉ์„œ (Pydantic)
        └── utils.py        # ๐Ÿ› ️ ํŒจํ‚ท ์ „์šฉ ํ—ฌํผ ๋ฐ ๊ฐ€๊ณต ๊ณ„์‚ฐ ํ•จ์ˆ˜


```


database.py

import os from contextlib import contextmanager # contextmanager ์ž„ํฌํŠธ from typing import Generator from dotenv...