π₯ νκ΅ν΄μλνκ΅ μΈκ³΅μ§λ₯곡νλΆ μ»΄ν¨ν°κ³΅νμ 곡 νν μμΉμ ν μΉνμ΄μ§ κ΅¬μΆ νλ‘μ νΈ π₯
python
λ²μ κ΄λ¦¬ λͺ©μ pyenv
μ€μΉpython
ν¨ν€μ§ κ΄λ¦¬ λͺ©μ poetry
μ€μΉκ°μ νκ²½ μμ±
python -m venv .venv
μμ‘΄μ± μ€μΉ λͺ¨λ νΈν μλ¬ λ κ²½μ° κ°λ° OS μ°¨μ΄ λλ¬Έμ΄λ poetry.toml νμΌ μ°Έκ³ ν΄μ μ°μ μ μλμΌλ‘ μ€μΉν΄μ£ΌμΈμ. μΆν, windowμλ νΈνλκ² μμ ν΄λκ² μ΅λλ€.
poetry install
PostgreSQL μ΄λ―Έμ§ λ€μ΄λ‘λ
docker -v
docker pull postgres:latest
docker run --name postgres -e POSTGRES_PASSWORD=postgres -e TZ=Asia/Seoul -p 5432:5432 -d postgres:latest
μ΄ν DBeaverμ μ μν΄μ Dockerμμ μ€νλλ PostgreSQLκ³Ό μ°κ²°
λ€μ
ν΄λ¦jdbc:postgresql://localhost:5432/postgres
μ νμλμ§ νμΈ νVScodeμμ Uvicorn μλ² μ€ν
uvicorn src.main:app --reload
μλ² μ€ν μ΄ν DBeaver μμ postgres λ₯Ό μ°ν΄λ¦νμ¬ κ²μ¦/μ¬μ°κ²° μ λλ¬μ μ μ μ°κ²°λκ³ μλμ§ νμΈν ν, public -> table -> user μ ν΄λ¦ν΄μ userν μ΄λΈμ΄ μ μμ μΌλ‘ μμ±λμλμ§ νμΈνλ€.
Semtle-Web-Server/
β
βββ asset # νλ‘μ νΈμ μ¬μ©λλ μ μ μμλ€(μ΄λ―Έμ§, CSS νμΌ λ±) λͺ¨μ
βββ src/ # μμ€ μ½λ ν΄λ, μ¬κΈ°μ νλ‘μ νΈμ λͺ¨λ νμ΄μ¬ μ½λκ° λ€μ΄κ°
β βββ api/ # API κ΄λ ¨ μ½λλ₯Ό λͺ¨μλ ν΄λ
β β βββ __init__.py # API λͺ¨λμ μ΄κΈ°ννλ μ€ν¬λ¦½νΈ, api ν΄λλ₯Ό νμ΄μ¬ ν¨ν€μ§λ‘ λ§λ¬
β β βββ v1/ # APIμ 첫 λ²μ§Έ λ²μ μ μ μν ν΄λ
β β β βββ __init__.py
β β β βββ post/ # 'post' κ΄λ ¨ κΈ°λ₯λ€μ μ²λ¦¬νλ μ½λκ° λ€μ΄μλ ν΄λ
β β β β βββ __init__.py
β β β β βββ post_control.py # μλν¬μΈνΈ λ‘μ§ μμ±, HTTP μμ² μ²λ¦¬
β β β β βββ post_dao.py # λ°μ΄ν°λ² μ΄μ€ μ κ·Όνλ λ‘μ§ κ΅¬ν
β β β β βββ post_dto.py # λ°μ΄ν° μ μ‘ κ°μ²΄(λ°μ΄ν°μ ꡬ쑰λ₯Ό μ μ)
β β β β βββ post_service.py # λΉμ¦λμ€ λ‘μ§ μ²λ¦¬
β β ...
β β
β βββ core/ # μ ν리μΌμ΄μ
ν΅μ¬ κΈ°λ₯ λͺ¨μ
β β βββ __init__.py
β β βββ config.py # μ ν리μΌμ΄μ
μ μ€μ μ κ΄λ¦¬
β β βββ security.py # 보μ κ΄λ ¨ κΈ°λ₯ ꡬν
β β βββ error.py # μλ¬ νΈλ€λ§ κ΄λ ¨ μ½λ ꡬν
β β βββ event.py # μ ν리μΌμ΄μ
μμ λ°μνλ μ΄λ²€νΈ νΈλ€λ§
β β βββ status.py # HTTP μν μ½λ μΆκ° μ μ(νμ₯)
β β βββ cors.py # μμ² νν°λ§ λ―Έλ€μ¨μ΄ (μΉ μμ² μ¬μ΄μ μμ 곡μ λ₯Ό μν μ€μ )
β β
β βββ dependencies/ # API μλν¬μΈνΈμ μμ‘΄μ±(μ’
μμ±) κ΄λ¦¬λ₯Ό μν νμΌ λͺ¨μ (API μμ² μ κ²μ¬)
β β βββ __init__.py.
β β βββ authentication.py # μλν¬μΈνΈμμ νμν λͺ¨λ μ¬μ©μ μΈμ¦ κ΄λ ¨ μ’
μμ± κ΄λ¦¬ μ½λ
β β
β βββ var/ # μ ν리μΌμ΄μ
λͺ¨λΈ, λ°μ΄ν°λ² μ΄μ€ μΈμ
κ΄λ¦¬ μ½λ λͺ¨μ
β β βββ __init__.py
β β βββ dto.py # μ μ§λ³΄μμ±μ μν BaseDTO μ€μ
β β βββ models.py # μ ν리μΌμ΄μ
μμ μ¬μ©λλ λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈ μ μ
β β βββ session.py # λ°μ΄ν°λ² μ΄μ€ μ°κ²° λ° μΈμ
κ΄λ¦¬λ₯Ό μν μ½λ
β β
β β
β βββ utils/ # μ νΈλ¦¬ν° ν¨μ λͺ¨μ
β β βββ __init__.py
β β
β βββ __init__.py # μ ν리μΌμ΄μ
μ μ΄κΈ°ννλ μ€ν¬λ¦½νΈ, λμΌν python ν¨ν€μ§λ‘ λ§λ¬
β βββ main.py # FastAPI μ ν리μΌμ΄μ
μ μ§μ
μ
β
βββ tests/ # ν
μ€νΈ μ½λ, μ ν리μΌμ΄μ
κΈ°λ₯ κ²μ¦
β β ...
β
βββ .gitignore # Git λ²μ κ΄λ¦¬μμ μ μΈν νμΌ λͺ©λ‘
βββ Dockerfile # Dockerλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ
μ 컨ν
μ΄λννλ μ€μ
βββ docker-compose.yml # μ¬λ¬ 컨ν
μ΄λλ₯Ό ν¨κ» κ΄λ¦¬νκ³ μ€ννκΈ° μν μ€μ
βββ poetry.lock # νλ‘μ νΈ μμ‘΄μ± κ΄λ¦¬, μ€μ λ‘ μ€μΉλ ν¨ν€μ§ λ²μ μ κΈ(κ³ μ ) μ€μ
βββ pyproject.toml # μ€μΉν ν¨ν€μΉ λͺ©λ‘, νΈν κ°λ₯ν λ²μ μ 보 λͺ
μ
βββ README.md