Jayden1116
Jayden`s LifeTrip ๐Ÿ”†
Jayden1116
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • Jayden`s (481)
    • ๐Ÿฏ Hello, Jayden (144)
      • ์ผ๊ธฐ (1)
      • ์‹ ๋ฌธ (121)
      • ์Œ์•… (6)
      • ๊ฒฝ์ œ (16)
    • ๐Ÿ’› JavaScript (88)
      • ์ด๋ชจ์ €๋ชจ (4)
      • ๋ฐฑ์ค€ (44)
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (40)
      • ๋ฒ„๊ทธ (0)
    • ๐ŸŽญ HTML CSS (6)
      • ํํŠธ๋ฏ€๋ฅด (2)
      • ํฌ์Šค์Šค (4)
    • ๐Ÿ’ป CS (13)
      • ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (1)
      • ๋„คํŠธ์›Œํฌ (9)
      • ์šด์˜์ฒด์ œ (1)
      • ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค (0)
      • ๋””์ž์ธ ํŒจํ„ด (1)
    • ๐Ÿ Python (71)
      • ๋ฐฑ์ค€ (67)
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
    • ๐Ÿ’ฟ Data (156)
      • ์ด๋ชจ์ €๋ชจ (65)
      • ๋ถ€ํŠธ์บ ํ”„ (89)
      • ๊ทธ๋กœ์Šค ํ•ดํ‚น (2)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿ”ด ๋ธ”๋กœ๊ทธ(ํ™ˆ)
  • ๐Ÿฑ Github
  • ๊ธ€์“ฐ๊ธฐ
  • ํŽธ์ง‘
hELLO ยท Designed By JSW.
Jayden1116

Jayden`s LifeTrip ๐Ÿ”†

๐Ÿ’ฟ Data/๋ถ€ํŠธ์บ ํ”„

[TIL]59.๋ฐฐํฌ(Heroku)์™€ ๋Œ€์‹œ๋ณด๋“œ(Metabase)

2022. 2. 9. 00:52

ํ‚ค์›Œ๋“œ

  • 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] ํ•„์ˆ˜ ํŒŒ์ผ๋“ค

  1. requirements.txt (Pipfile, setup.py ๋กœ ๋Œ€์ฒด๊ฐ€๋Šฅ) ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋“ค์˜ ๋ชฉ๋ก
    heroku์— ์–ด๋–ค ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

    $ pip freeze > requirements.txt # ํ˜„์žฌ pip ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— requirements.txt ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
  2. 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) ์˜์—ญ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ํ†ต์ฐฐ๋ ฅ์„ ์–ป๊ธฐ์œ„ํ•ด ๋ณด๊ณ ์„œ ํ˜•ํƒœ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ์˜ ์žฅ์ 

  1. DB์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ์ƒ์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ณ€๋™์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜
  2. ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ๋น„๋ฐ์ดํ„ฐ ์ง๊ตฐ๋„ ์ง๊ด€์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์œ ์ €๊ฐ€ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

[๋Œ€์‹œ๋ณด๋“œ]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
    '๐Ÿ’ฟ Data/๋ถ€ํŠธ์บ ํ”„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [TIL]60-2. ๋ถ€ํ˜ธํ™”/๋ณตํ˜ธํ™”
    • [TIL]60-1. ์‹œ๊ฐ„, ์Šค์ผ€์ฅด๋ง
    • [TIL]58.Flask
    • [TIL]57.Docker
    Jayden1116
    Jayden1116
    ์•„๋งˆ๋„ ํ•œ๋ฒˆ ๋ฟ์ธ ์ธ์ƒ์„ ์—ฌํ–‰ ์ค‘์ธ Jayden์˜ ์ผ์ง€๐Ÿ„๐ŸŒŠ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”