๋ฐฑ์ค๋
๋ฐฑ์๋๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ ๊ทผํ์ง ์๋ ์๋ฒ ์ธก ์์คํ ์ ์๋ฏธํ๋ฉฐ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋น์ฆ๋์ค ๋ก์ง, ์ธ์ฆ, API ์ ๊ณต ๋ฑ์ ๋ด๋นํ๋ค.
๋ฐฑ์๋ ํ๋ ์์ํฌ๋?
- ๋ฐฑ์๋ ํ๋ ์์ํฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ ๋ชจ์์ด๋ค.
- ๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๋ณด์ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๐ก ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์
- โ ๋ฐ๋ณต์ ์ธ ์์ ๊ฐ์ → ์์ฒญ ๋ผ์ฐํ , ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฑ์ ์๋ํ
- โ ๊ฐ๋ฐ ์๋ ํฅ์ → ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ด ์ ๊ณต๋จ
- โ ๋๋ฒ๊น ๊ณผ ํ ์คํธ ๋๊ตฌ ์ ๊ณต → ์ค๋ฅ ์ฐพ๊ธฐ๊ฐ ์ฌ์
์ด๋ค ํ๋ ์์ํฌ๋ฅผ ๊ณ ๋ฅผ์ง ๊ณ ๋ ค์ฌํญ
- ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ณต์ก๋
- ํ๋ ์์ํฌ ํ์ฅ ๊ฐ๋ฅ์ฑ
- ์ปค๋ฎค๋ํฐ
- ๋ผ์ด์ ์ค ์ ์ฑ
Flask
- ์ฅ์
- ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ณ๋ค. ๋ถํ์ํ ๊ธฐ๋ฅ์ด ์์ด, ํ์ํ ๊ธฐ๋ฅ๋ง ์ถ๊ฐํด์ ์ฌ์ฉ ๊ฐ๋ฅ
- ์์ ๋๊ฐ ๋๋ค. ๊ฐ์ ์ ์ธ ๊ตฌ์กฐ ์์ด ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ
- ๋จ์
- ๋ณต์กํ ๊ฐ๋ฐ์๋ ์ ํฉํ์ง ์๋๋ค. ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ์ด ์ ์ด์, ํฐ ํ๋ก์ ํธ์์๋ ์ค์ ํ ๊ฒ ๋ง์์ง
๋ฐฑ์ค๋๋ฅผ ์ํ ๋์์ธ ํจํด
๋์์ธํจํด: ์ํํธ์จ์ด ์ค๊ณ์์ ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ก ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ณ ๋ คํ ์ฌ๋ฌ ๋์์ธ ํจํด์ด ์ฌ์ฉ
MVCํจํด: Model - View - controller
- ๋ชจ๋ธ: ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง ๊ด๋ฆฌ
- ๋ทฐ: ๋ ์ด์์๊ณผ ํ๋ฉด ์ฒ๋ฆฌ
- ์ปจํธ๋กค๋ฌ: ๋ช ๋ น์ ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ๋ถ์ผ๋ก ๋ผ์ฐํ
ํ๋ผ์คํฌ MVC ๊ตฌ์กฐ
- Model: ORM์ฌ์ฉํ DB๊ตฌ์กฐ
- View: Jinja ํ ํ๋ฆฟ
- Controller: @app.route()๋ก ์ ์๋ ํจ์๋ค
project/
โ
โโโ app/
โ โโโ models/ ← Model (SQLAlchemy ๋ชจ๋ธ ๋ฑ)
โ โโโ views/ ← View (Jinja ํ
ํ๋ฆฟ)
โ โโโ controllers/ ← Controller (Flask route ํจ์๋ค)
โ โโโ static/ ← ์ ์ ํ์ผ (CSS, JS ๋ฑ)
โ โโโ __init__.py ← ์ฑ ํฉํ ๋ฆฌ. ๋น์ด์๋ ํ์ผ. ์์ฑํด๋ ๋๊ณ ์ํด๋ ๋จ.
โ
โโโ config.py
โโโ run.py
์น ์๋ฒ, WAS, WSGI
์น ์๋ฒ (Web Server): ์ ์ ํ์ผ์ ์ ๊ณตํ๋ ์๋ฒ
- ๋ํ์ ์ธ ์น ์๋ฒ: Nginx, Apache
- HTML, CSS, JavaScript ๊ฐ์ ์ ์ ์ธ ํ์ผ์ ์ ๊ณตํ๋ ์ญํ
- ํ์ง๋ง Flask/Django ๊ฐ์ ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์คํํ์ง ๋ชปํจ
- ๊ทธ๋์ ๋์ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์ํด WAS๊ฐ ํ์ํ๋ค.
WAS (Web Application Server): ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ
- (Java ํ๊ฒฝ): Tomcat, JBoss, WebLogic
- (Python ํ๊ฒฝ): Gunicorn, uWSGI (WSGI ์๋ฒ)
- ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , DB ์กฐํ ํ ์๋ต์ ์์ฑ
- WAS๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ๋ด๋น
WSGI(Web Server Gateway Interface)
- ํ์ด์ฌ์์ ์น ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค, ์น์๋ฒ์ ํ์ด์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ด ํต์ ํ๊ธฐ ์ํ ๊ท์ฝ
- ์ธํฐํ์ด์ค: ์๋ก ๋ค๋ฅธ ์์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ด ๊ณตํต๋ ํ์์ผ๋ก ์ํตํ ์ ์๋๋ก ์ ํ ๊ท์น
- REST API์์ JSON ํ์์ผ๋ก ์์ฒญ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ → ์๋ก ๋ค๋ฅธ ์์คํ ์ด ๊ฐ์ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ๋ง๋ ์ธํฐํ์ด์ค
- ์น ์ ํ๋ฆฌ์ผ์ด์
(์: Flask, Django ๋ฑ)๊ณผ ์น ์๋ฒ(์: Gunicorn, uWSGI, Nginx)๋ ์๋ก ๋ค๋ฅด๊ฒ ๋์ํ๋๋ฐ, ์ด ๋์ด ์๋ก ์ํตํ ์ ์๋๋ก ์ค๊ฐ์์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ท์ฝ์ด WSGI
- WAS(์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ) = ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ
- ํ์ด์ฌ์์๋ WAS ๋์ WSGI ์๋ฒ(Gunicorn, uWSGI ๋ฑ)๋ฅผ ์ฌ์ฉ
- Nginx, Apache์ ๊ฐ์ ์๋ฒ๋ค์ django, flask๋ก ์์ฑํ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ธ์ํ์ง ๋ชปํ๋ค.
- ์ด ๋ WSGI๋ฅผ ์ด์ฉํด ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ก ํต์ ํ ์ ์๊ฒ ๋จ
Java ํ๊ฒฝ
- ์น ์๋ฒ: Nginx, Apache
- WAS: Tomcat, JBoss
- ์น ์ ํ๋ฆฌ์ผ์ด์ : Spring Boot, JSP
Python ํ๊ฒฝ
- ์น ์๋ฒ: Nginx, Apache
- WSGI ์๋ฒ (WAS ์ญํ ): Gunicorn, uWSGI
- ์น ์ ํ๋ฆฌ์ผ์ด์ : Flask, Django, Fast API
WSGI ์๋ฒ๊ฐ ๋์ํ๋ ๋ฐฉ์
์๋ฒ ๊ตฌ์ฑ: Nginx + Gunicorn + Flask
- ์ฌ์ฉ์๊ฐ http://example.com์ ์ ์
- Nginx๊ฐ ์์ฒญ์ ๋ฐ์ → ์ ์ ํ์ผ์ด๋ฉด ์ง์ ์๋ต
- ์ ์ ํ์ผ์ด ์๋๋ผ๋ฉด ์์ฒญ์ Gunicorn(WSGI ์๋ฒ)์ผ๋ก ์ ๋ฌ
- Gunicorn์ด Flask ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ
- Flask๊ฐ DB ์กฐํ ๋ฑ ์ฒ๋ฆฌ ํ ์๋ต์ Gunicorn์ ๋ฐํ
- Gunicorn์ด ์๋ต์ Nginx์ ์ ๋ฌ
- Nginx๊ฐ ์ต์ข ์ ์ผ๋ก ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์๊ฒ ์๋ต
๐ Nginx๋ ์ ์ ํ์ผ ์ฒ๋ฆฌ, Gunicorn์ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ WAS ์ญํ
Flask
ํ์ด์ฌ ๊ฐ์ํ๊ฒฝ ์์ฑ
# pip๋ก ์ต์ด ๊ฐ์ํ๊ฒฝ ์์ฑ
python -m venv myvenv
# ๊ฐ์ํ๊ฒฝ ํ์ฑํ
source myvenv/bin/activate
# ๊ฐ์ํ๊ฒฝ ๋นํ์ฑํ
deactivate
๊ฐ์ํ๊ฒฝ์์ ํ๋ผ์คํฌ ์ค์น
# pip ์
๊ทธ๋ ์ด๋
$ python -m pip install --upgrade pip
# flask ์ค์น
$ pip install flask
# ํ๋ผ์คํฌ๋ app.py๋ฅผ ์์ํ์ผ๋ก ์ธ์ํ์ฌ ์คํ์ด ์์
$ flask run
# flask run --debug ๋ช
๋ น์ ์คํํด ๋๋ฒ๊น
์ด ๊ฐ๋ฅํ๋๋ก ์ค์
$ flask run --debug
python app.py vs flask run
- python app.py
- Flask ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์คํํ๋ ๋ฐฉ์
- if name == "main": app.run() ์ฝ๋๊ฐ ํฌํจ๋ ํ์ผ์ ์ง์ ์คํํด์ผ ํ๋ฉฐ, Flask์ ๊ธฐ๋ณธ ๋ด์ฅ ์๋ฒ๊ฐ ๊ตฌ๋๋๋ค.
- ๋๋ฒ๊ทธ ๋ชจ๋ ํ์ฑํ: app.run(debug=True)๋ฅผ ์ฝ๋์ ์ง์ ์ถ๊ฐํด์ผ ํ๋ค.
- flask run
- Flask์ CLI๋ฅผ ์ด์ฉํด ์คํํ๋ ๋ฐฉ์์ด๋ค.
- FLASK_APP ํ๊ฒฝ ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Flask ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉฐ, CLI์์ ๋ค์ํ ์ค์ ์ ์ถ๊ฐํ ์ ์๋ค.
- ๋๋ฒ๊ทธ ๋ชจ๋ ํ์ฑํ: flask run์ ์คํํ ๋ flask run --debug ์ต์
์ ๋ถ์ด๋ฉด ๋๋ฉฐ
- .flaskenv ๊ฐ์ ํ๊ฒฝ ํ์ผ์ ํ์ฉํ ์ ์์ด, ๋ณด๋ค ํ์ฅ์ฑ์ด ๋๊ณ ์ค๋ฌด์์ ์ ํธ๋๋ค.
- ๊ฒฐ๋ก ์ ์ผ๋ก, python app.py๋ ์์ ํ๋ก์ ํธ์์ ๊ฐ๋จํ ์คํํ ๋ ์ ํฉํ๊ณ , flask run์ ํ๊ฒฝ ๋ณ์ ์ค์ ๋ฐ ๋ค์ํ ์ต์ ์ ํ์ฉํ ์ ์์ด ๋ ์ ์ฐํ ๋ฐฉ์์ด๋ค.
- ๋๋ ํญ์ ์ฅ๊ณ ๋ fast api ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋ flask run ์ ์ฌ์ฉํ๋ ํธ์ด๋ค.
# test.py - ๊ธฐ๋ณธ์ ์ผ๋ก๋ app.py ๋ผ๋ ํ์ผ์ ์์์ ์ผ๋ก ํด์ ๋๋จธ์ง ํ์ผ์ ์ฝ๋๋ค.
from flask import Flask
# Flask ์ดํ๋ฆฌ์ผ์ด์
์ ์์ฑํ๋ ์ฝ๋
# ์ด ํ์ผ์ ๋ค๋ฅธ ํ์ผ ๊ฒฝ์ ์์ด test.py๋ฅผ ํตํด ์คํ๋๋ค๋ฉด __name__ ๋ณ์์๋ 'test'๋ผ๋ ๋ฌธ์์ด์ด ๋ด๊น
app = Flask(__name__)
# URL๊ณผ FLASK์ฝ๋๋ฅผ ๋งคํํ๋ Flask ๋ฐ์ฝ๋ ์ดํฐ
@app.route('/')
def hello():
return 'Hello'
if __name__ == '__main__':
app.run()
- python test.py๋ก ์คํํ๋ฉด name ๊ฐ์ด 'main'์ด ๋์ด app.run()์ด ์คํ๋๋ค. ์ฆ, Flask ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง์ ์คํ๋๋ค.
- flask run์ ์คํํ๋ฉด Flask๋ ๊ธฐ๋ณธ์ ์ผ๋ก app.py๋ฅผ ์ฐพ์ง๋ง, ๋ง์ฝ ํ์ผ๋ช
์ด test.py๋ผ๋ฉด?
- Flask๋ test.py๋ฅผ ๋ชจ๋ฆโ
- FLASK_APP=test.py ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋ฉด test.py๋ฅผ ์คํํ ์ ์๋ค.
- ๋งฅ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Flask ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ FLASK_APP ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์์ ํ์ผ์ ์ง์ ํ ์ ์๋ค.
- ๋ฐ๋ผ์ .zshrc ํ์ผ์์ export FLASK_APP=test.py๋ฅผ ์ค์ ํ๋ฉด, flask run ๋ช ๋ น์ ์คํํ ๋ test.pyํ์ผ์ด ์์์ ์ผ๋ก ์คํ
Flask ๊ตฌ์กฐ
flask๋ django๋ fast-api๋ ๋๊ฐ๋ค.
- models.py
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ ์ ์ฒ๋ฆฌํ๋ ์ญํ
- Flask์์๋ ORM์ ์ง์ํ๋ ํ์ด์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๊ตฌ์ธ SQLAlchemy๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ์ฝ๊ฒ ๊ด๋ฆฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋ชจ๋ธ์ ์ ์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ์์ , ์ญ์ ๋ฐ ์กฐํํ๋ ๊ธฐ๋ฅ์ ๋ด๋น
- forms.py
- ์น ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ์ ์ก๋ ํผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
- Flask์์๋ WTForms๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ ๋ชจ๋ธ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌ
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ ์๋ฒ๋ก ์ ์กํ ์ ์๋ ํผ์ ์ ์
- templates ๋๋ ํฐ๋ฆฌ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ HTML ํ์ผ์ด ์ ์ฅ
- Flask์์๋ Jinja2 ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ฌ ๋์ ์ธ ์ฝํ ์ธ ๋ฅผ HTML ํ์ผ์ ๋ ๋๋งํ ์ ์๋ค.
- views ๋๋ ํฐ๋ฆฌ
- ํ๋ฉด์ ๊ตฌ์ฑํ๋ ํจ์๋ค๋ก ๊ตฌ์ฑ๋ ๋ทฐ ํ์ผ๋ค์ด ์ ์ฅ
- ํ๋ก์ ํธ์ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ ๋ทฐ ํ์ผ์ ๋ง๋ค ์ ์์
- ๊ฐ ๋ทฐ ํ์ผ์๋ URL ๊ฒฝ๋ก์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋ด๊ฒจ ์๊ณ ํด๋น ๊ฒฝ๋ก์ ๋ํ HTML์ ๋ฐํํ๋ ์ญํ ์ ํ๋ค.
- static ๋๋ ํฐ๋ฆฌ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ์ ์ ํ์ผ(CSS ํ์ผ, JavaScript ํ์ผ, ์ด๋ฏธ์ง ํ์ผ)๋ค์ ์ ์ฅ
- ์ ์ ํ์ผ์ ์น ํ์ด์ง์ ์คํ์ผ์ด๋ ๋์์ ์ ์ดํ๋ฉฐ ํ๋ฒ ์ ๋ก๋๋ ํ์๋ ์์ ๋์ง ์๊ณ ๊ณ ์
- config.py
- config.py ํ์ผ์ ํ๋ก์ ํธ์ ์ค์ ์ ๊ด๋ฆฌ
- ํ๊ฒฝ ๋ณ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด ๋ฑ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์น ์ค์ ์ ๊ธฐ๋ก
- ex) ๋ฐ์ดํฐ๋ฒ ์ด์ค URI, ๋น๋ฐ ํค, ํ๊ฒฝ ์ค์ ๋ฑ์ ์ด ํ์ผ์์ ์ ์ํ๊ณ , Flask ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ์ด๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ์ ์ ์ฉ
Blueprint
- ๋ฌธ์ ์ํฉ
create_appํจ์ ์์ ์๋ก์ด URL ๋งคํ์ด ํ์ํ ๋๋ง๋ค ๋ผ์ฐํ ํจ์๋ค์ ๊ณ์ ์ถ๊ฐํ๋ค๋ฉด, create_appํจ์๋ ์ ์ ๊ธธ๊ณ ๋ณต์กํด์ง๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋๋ง๋ค ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- Blueprint์ ์ญํ
Blueprint๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ก ๋๋ ์ ์๋ค. ๊ฐ ๋ชจ๋์ ์์ฒด์ ์ผ๋ก ๋ผ์ฐํ , ๋ทฐ ํจ์, ํ ํ๋ฆฟ ๋ฑ์ ๊ด๋ฆฌํ๊ณ , ๋์ค์ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ์ฌ ์ฌ์ฉํ ์ ์์ด์ ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ๋ณ๋ก ๋๋์ด ๊ด๋ฆฌํ ์ ์๋ค.
- Blueprint์ ํน์ง
- ๊ธฐ๋ฅ๋ณ ๋ถ๋ฆฌ
- Blueprint๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ๋ณ๋ก ๋๋์ด ๊ด๋ฆฌํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, "ํ์๊ฐ์ ", "๊ฒ์ํ", "๊ด๋ฆฌ์ ํ์ด์ง" ๋ฑ์ผ๋ก ๋๋ ์ ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ๋ผ์ฐํ ๊ณผ ๋ทฐ ํจ์๋ค์ ๋ณ๋์ ๋ธ๋ฃจํ๋ฆฐํธ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ฅ์ฑ ํฅ์
- ๊ฐ Blueprint๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
- ํ ๋ฒ ๋ง๋ Blueprint๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ ์ง๋ณด์ ์ฉ์ด
- ๊ฐ ๊ธฐ๋ฅ์ ๋ณ๋์ ๋ชจ๋๋ก ๊ด๋ฆฌํ๋ฏ๋ก ๊ธฐ๋ฅ์ ์์ ํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์์ ํ ์ ์๋ค.
์ด์ Flask ์ ํ๋ฆฌ์ผ์ด์ ์์ Blueprint๋ฅผ ํ์ฉํ ๋ผ์ฐํ ๋ชจ๋ํํด๋ณด์
myproject/
โ
โโโ blueprints/
โ โโโ __init__.py
โ โโโ product.py
โ โโโ user.py
โ
โโโ app.py
blueprints/product.py
from flask import Blueprint, jsonify
# Blueprint ์์ฑ (์ด๋ฆ: product_bp, URL ํ๋ฆฌํฝ์ค: /product)
product_bp = Blueprint('product', __name__, url_prefix='/product')
@product_bp.route('/list')
def product_list():
return jsonify({"message": "Product List Page"})
@product_bp.route('/detail/<int:product_id>')
def product_detail(product_id):
return jsonify({"message": f"Product Detail for ID {product_id}"})
- ์ ํ๊ณผ ๊ด๋ จ๋ ๋ผ์ฐํธ๋ฅผ ๊ด๋ฆฌ
- ex) ์ ํ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง์ ๊ฐ๋ณ ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง๋ฅผ ์ ๊ณต
- product_bp๋ /product URL ํ๋ฆฌํฝ์ค๋ฅผ ๊ฐ์ง ๋ผ์ฐํธ๋ฅผ ์ ์
- /product/list์ /product/detail/<int:product_id> URL์ ๋ํ ๋ผ์ฐํ ์ ์ฒ๋ฆฌ
blueprints/user.py
from flask import Blueprint, jsonify
# Blueprint ์์ฑ (์ด๋ฆ: user_bp, URL ํ๋ฆฌํฝ์ค: /user)
user_bp = Blueprint('user', __name__, url_prefix='/user')
@user_bp.route('/profile')
def profile():
return jsonify({"message": "User Profile Page"})
@user_bp.route('/settings')
def settings():
return jsonify({"message": "User Settings Page"})
- ์ฌ์ฉ์์ ๊ด๋ จ๋ ๋ผ์ฐํธ๋ฅผ ๊ด๋ฆฌ, ์ฌ์ฉ์ ํ๋กํ๊ณผ ์ค์ ์ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง๋ฅผ ์ ๊ณต
- user_bp๋ /user URL ํ๋ฆฌํฝ์ค๋ฅผ ๊ฐ์ง ๋ผ์ฐํธ๋ฅผ ์ ์
- /user/profile์ /user/settings URL์ ๋ํ ๋ผ์ฐํ ์ ์ฒ๋ฆฌ
Flask ์ ํ๋ฆฌ์ผ์ด์ ์ Blueprint ๋ฑ๋ก
from flask import Flask
from blueprints.product import product_bp
from blueprints.user import user_bp
# Flask ์ ํ๋ฆฌ์ผ์ด์
์์ฑ
app = Flask(__name__)
# Blueprint ๋ฑ๋ก (user_bp์ product_bp)
app.register_blueprint(user_bp)
app.register_blueprint(product_bp)
@app.route('/')
def hello():
return 'Hello'
if __name__ == '__main__':
app.run()
์ด์ app.py ํ์ผ์ ๋ง๋ค์ด์ ๊ฐ Blueprint๋ฅผ Flask ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ Blueprint์์ ์ ์ํ URL ๋ผ์ฐํธ๋ฅผ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
- app.py์์ user_bp์ product_bp๋ฅผ ์ํฌํธํ์ฌ Flask ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋ก
- @app.route('/')๋ ๊ธฐ๋ณธ ํ์ด์ง. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉด 'Hello'๋ฅผ ์ถ๋ ฅ
์คํ ๊ฒฐ๊ณผ
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด, ๊ฐ Blueprint์์ ์ ์ํ URL ๋ผ์ฐํธ์ ์ ์ํ ์ ์๋ค.
- /product/list: ์ ํ ๋ชฉ๋ก ํ์ด์ง
- /product/detail/<int:product_id>: ํน์ ์ ํ ์ธ๋ถ ์ ๋ณด ํ์ด์ง
- /user/profile: ์ฌ์ฉ์ ํ๋กํ ํ์ด์ง
- /user/settings: ์ฌ์ฉ์ ์ค์ ํ์ด์ง
ํฉํ ๋ฆฌ ํจํด
Flask ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ๋ฐฉ๋ฒ
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run()
์ด ๋ฐฉ์์ ๋จ์
- ์ฑ์ด ํ๋์ ๊ณ ์ ๋ ์ธ์คํด์ค(app)์ ์ข ์๋จ
- ๊ฐ๋ฐ ํ๊ฒฝ, ํ ์คํธ ํ๊ฒฝ, ์ด์ ํ๊ฒฝ๋ณ๋ก ๋ค๋ฅด๊ฒ ์ค์ ํ๋ ค๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง
- ์ฑ์ ์ด๊ธฐํํ ๋ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ฐ๋ก ๋ฑ๋กํด์ผ ํจ
ํฉํ ๋ฆฌ ํจํด
from flask import Flask
def create_app():
app = Flask(__name__)
# ์ค์ ์ ์ฉ
app.config.from_object('config')
# ๋ธ๋ฃจํ๋ฆฐํธ ๋ฑ๋ก (์: auth ๊ด๋ จ ๋ธ๋ฃจํ๋ฆฐํธ)
from app.blueprints.auth.routes import auth_bp
app.register_blueprint(auth_bp)
return app
์ด ๋ฐฉ์์ ์ฅ์
- ํ๊ฒฝ๋ณ ์ค์ ์ ์ฝ๊ฒ ๋ถ๋ฆฌ ๊ฐ๋ฅ
- Blueprint์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ชจ๋ํํ๊ธฐ ์ฌ์
- ํ ์คํธํ๊ธฐ ์ฉ์ด
๊ฐ๋ฐ/์ด์ ํ๊ฒฝ ์ค์ ์ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์
import os
def create_app():
app = Flask(__name__)
# ํ๊ฒฝ ๋ณ์์ ๋ฐ๋ผ ์ค์ ํ์ผ ๋ค๋ฅด๊ฒ ๋ก๋
env = os.getenv('FLASK_ENV', 'development')
if env == 'development':
app.config.from_object('config.DevConfig')
elif env == 'production':
app.config.from_object('config.ProdConfig')
return app
'๐ผ ๋ฐฑ์ค๋ > Flask' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Flask์์ ํ ํ๋ฆฟ ์ฌ์ฉํ๊ธฐ (0) | 2025.03.29 |
---|---|
flask with ORM (0) | 2025.03.27 |