ํค์๋
- Heroku
- ๋ฐฐํฌ
- WSGI
- ํ๊ฒฝ๋ณ์
- Metabase
WSGI
Web Server Gateway Interface
์น์๋ฒ
์์ดํ๋ฆฌ์ผ์ด์ ํน์ ํ๋ ์์ํฌ
์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ์ค๊ฐ๋ค๋ฆฌ ์ญํ (middleware)- ์๋ฅผ ๋ค์ด, flask๋ฅผ ํตํด app์ ๊ตฌ์ถํด๋์ผ๋ฉด WSGI๋ฅผ ํตํด ์๋ฒ๋ก ์ฐ๊ฒฐํด์ ์ธ๋ถ์์ ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ
[WSGI]gunicorn
- green unicorn ์ ์ฝ์๋ก, ํ์ด์ฌ์ WSGI HTTP server
- HTTP ๊ด๋ จ๋ ์น ์์ฒญ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด flask์ ๊ฐ์ app์ ์ด์ฉํด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ์ญํ
flask run
์ ํตํด Werkzeug์์๋ถํฐ ๊ฐ๋ฐ๋จ๊ณ์์ ์ด์ฉํ๋ WSGI๋ฅผ ์ ๊ณตํด์ฃผ๊ธด ํ์ง๋ง WSGI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ผ ๋ฟ ์์ฒด๋ก ์๋ฒ๋ ์๋- ์ฆ, ๊ฐ๋ฐ ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ๋ ์ฉ๋์ด๋ฏ๋ก ํจ์จ์ ์ธ ๊ด๋ฆฌ๋ ์๋จ, ๊ทธ๋ฌ๋ฏ๋ก gunicorn์ ํตํด WSGI ์๋ฒ๋ก ๋๊ธฐ๊ณ ๊ทธ๊ณณ์์ ๊ตฌ๋
์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ํํ๋ฅผ ์ทจํฉ๋๋ค.
$ gunicorn [์ต์
] [WSGI ์ดํ๋ฆฌ์ผ์ด์
]
$ gunicorn --workers=1 'flask_app:create_app()' # ํฉํ ๋ฆฌ ํํ๋ก ์คํํ ๋
$ gunicorn --workers=1 flask_app:app
Heroku
- ํด๋ผ์ฐ๋ ํ๋ซํผ์ ์ ๊ณตํ๋ ์๋น์ค(์๋ฒ๋ฅผ ์ ๊ณต)
- AWS(Amazon Web Services)์ EC2(Elastic Compute Cloud)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์
- ๋ค๋ง, AWS๋ณด๋ค ์ข๋ ํธ๋ฆฌํ๊ณ ๋ฌด๋ฃ๋ก ์ ๊ณต์ ํ๋ ๋จ์๊ฐ ์์ด ๊ฐ๋ฒผ์ด ๋ฐฐํฌ์ ์ข์
- ์ฐธ๊ณ ๋ก EC2๋ AWS์์ ์๋ฒ๋ฅผ ๋น๋ ค์ฃผ๋ ์๋น์ค
[Heroku]CLI
๊ฐ๋จํ Heroku CLI ๋ช ๋ น์ด
$ heroku login # ํ๋ก์ฟ ์ ๋ก๊ทธ์ธ
$ heroku apps # ๊ณ์ ๋ด์ ๋ฑ๋ก๋ ์ดํ๋ค ๋ชฉ๋ก
$ heroku create [app์ด๋ฆ] # heroku ์๋ฒ์ ์๋ ์๋ก์ด ์ด๋ฆ์ด์ด์ผ ๋ฑ๋ก์ด ๋ฉ๋๋ค.
$ heroku apps:info --app [app์ด๋ฆ] # ์์ ๋ง๋ค์ด์ค app์ ์ ๋ณด๋ฅผ ์ค๋๋ค. ์ด ๋, git url๋ ๊ฐ์ด ์์ฑํด์ค๋๋ค.
$ git init # ๊นํ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ณ
$ git remote add [์์ info ์์ ์์ฑ๋ git url] # ๊น ์ฃผ์๋ฅผ ํ ๋นํฉ๋๋ค.
$ git add ./
$ git commit -m '๋ฉ์์ง'
$ git push heroku main # git ์ปค๋ฐ์ ํ๋ฏ์ด ํ๋ก์ฟ ๊น์ pushํด์ฃผ๋ฉด ์ฑ์ด ๋ฐ์๋ฉ๋๋ค.
[Heroku] ํ์ ํ์ผ๋ค
requirements.txt
(Pipfile
,setup.py
๋ก ๋์ฒด๊ฐ๋ฅ) ์ฌ์ฉ๋๋ ํ์ด์ฌ ํจํค์ง๋ค์ ๋ชฉ๋ก
heroku์ ์ด๋ค ์ธ์ด๋ฅผ ์ฌ์ฉํ๋์ง ์๋ ค์ฃผ๊ธฐ ์ํจ์ ๋๋ค.$ pip freeze > requirements.txt # ํ์ฌ pip ํจํค์ง ๋ชฉ๋ก์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ requirements.txt ํ์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
Procfile : ์ด๋ค ํ๋ก์ธ์ค๋ฅผ ์คํ์์ผ์ผํ๋์ง ์๋ ค์ฃผ๋ ํ์ผ(์คํ ๋ง ์ ์ํด์ ์ ์ธ ๊ฒ!)
WSGI์ธ gunicorn์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐtouch Procfile
์ ํตํด ํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ ๊ทธ ์์ ๋ด์ฉ์ ์๋์ ๊ฐ์ด ์ ์ด์ค๋๋ค.web: gunicorn --workers=2 'flask_app:create_app()'
์ฆ, ์น์ ๋ฐฐํฌํ๋ ค๋ ๊ฒ์ด๊ณ WSGI์ ์กฐ๊ฑด์ ์์ ๊ฐ์ด(workers=2) flask_app์ create_app() ํจ์๋ฅผ ์คํ์์ผ๋ฌ๋ผ๋ ์๋ฏธ์ ๋๋ค.
์์ ์กฐ๊ฑด์ ์ค์ ํ๊ณ ๋ค์ ๊น ์ปค๋ฐ์ ํด์ฃผ๋ฉด
heroku apps:info ์์ ๋์ค๋ web url์ ํตํด ์ ์์ ๋ฐฐํฌํด์ค ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์๋ฉ๋๋ค.
์ถ๊ฐ) heroku run bash
๋ฅผ ํตํด ์ฑ์ ์์ ์ ๊ทผ ํ ์ ์์ต๋๋ค.
๋์๋ณด๋
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์๊ฐํํ์ฌ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก
๋์๋ณด๋
๊ฐ ์์ต๋๋ค. - ๋์๋ณด๋๋ ๋ฐ์ดํฐ๋ถ์๊ฐ(DA; Data Analyst) ์์ญ์์ ๋น์ฆ๋์ค ํต์ฐฐ๋ ฅ์ ์ป๊ธฐ์ํด ๋ณด๊ณ ์ ํํ๋ก ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋์๋ณด๋์ ์ฅ์
- DB์ ์ง์ ์ฐ๊ฒฐํ์ฌ ์์ฑํ๋ฉด ๋ฐ์ดํฐ ๋ณ๋์ฌํญ์ ์ค์๊ฐ ๋ฐ์
- ๋์๋ณด๋๋ฅผ ํตํด ๋น๋ฐ์ดํฐ ์ง๊ตฐ๋ ์ง๊ด์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
- ์ ์ ๊ฐ ๋ฐ์ดํฐ ํํฐ๋ฅผ ์กฐ์ํ์ฌ ๋ค๋ฃฐ ์ ์๋ ๊ธฐ๋ฅ
[๋์๋ณด๋]Metabase
- ๋์๋ณด๋ ํํ๋ก ์๊ฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ BI(Business Inteligence) ์ค ํ๋(์คํ์์ค)
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก์ปฌ์์ ์ฌ์ฉํ ๋, Jar File(์๋ฐ๋ก ๊ฐ๋ฐ๋ ํ์ผ), Mac Application, Docker 3๊ฐ์ง์ ์คํํ๊ฒฝ ์ ๊ณต
docker๋ฅผ ์ด์ฉํด์ metabase ์ด์ฉํ๋ ๋ฐฉ๋ฒ
$ docker run -p 3000:3000 --name metabase metabase/metabase
# ๋ก์ปฌ:3000๋ฒ์ ํตํด metabase ์ ์ ๊ฐ๋ฅ(์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ์ปจํ
์ด๋ ๊ฐ๋)
$ docker exec -it metabase bin/bash # metabase container ๋ด๋ถ๋ก ๋ค์ด๊ฐ ์ ์์(bash shell์ ์ด์ฉ)
# ์ผ๋ฐ ํฐ๋ฏธ๋๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ls, pwd, cd ๋ฑ์ผ๋ก ํด๋ ๋ฐ ์์น ํ์ธ
$ docker cp [db ๊ฒฝ๋ก] metabase:[์นดํผํด์ค metabase ๊ฒฝ๋ก]
# ์นดํผํด์ค ๋ค, ๋ก์ปฌ:3000 ์ ๋ฉํ๋ฒ ์ด์ค๋ก ๊ฐ์ db๋ฅผ ๋ฐ๋ ๊ณผ์ ์ ๊ฑฐ์น ํ ๋ค์ํ ์๊ฐํ ๋ฐ SQL ์ฟผ๋ฆฌ๋ฌธ ์์ฑ ๊ฐ๋ฅ!
์ถ๊ฐ ์ค์ํ ๋ด์ฉ
Flask -> ํ์ด์ฌ ๊ธฐ๋ฐ ์น ํ๋ ์์ํฌ(์ฆ, ํ์ด์ฌ์ผ๋ก๋ ์น ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์๋ฏธ)
๋ค์๋งํด, ํ์ด์ฌ์ด ๋ฐฑ์๋
๋ฅผ ๋ด๋น(์ด๊ฑธ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ flask ํ๋ ์์ํฌ)ํ๊ณ , HTML/CSS/JavaScript๋ฅผ ํตํด ํ๋ก ํธ์๋
๋ฅผ ๋ด๋นํ๋ค.
ํด๋ผ์ด์ธํธ --------------- ์น์๋ฒ --------------- WSGI --------------- ์ดํ๋ฆฌ์ผ์ด์
์น์๋ฒ : Heroku
WSGI : gunicorn
์ดํ๋ฆฌ์ผ์ด์
: ๋ฐฑ์๋-python(flask), ํ๋ก ํธ์๋-HTML/CSS/JavaScript
์ด๋ฐ ๋๋! ์๊ณ ์์!
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]60-2. ๋ถํธํ/๋ณตํธํ (0) | 2022.02.09 |
---|---|
[TIL]60-1. ์๊ฐ, ์ค์ผ์ฅด๋ง (0) | 2022.02.09 |
[TIL]58.Flask (0) | 2022.02.08 |
[TIL]57.Docker (0) | 2022.02.05 |
[TIL]56. Section3_Sprint2_Chall (0) | 2022.02.03 |