bky373 / elice_library

๐Ÿ“ Flask, MVC ํŒจํ„ด์„ ํ™œ์šฉํ•œ ๋„์„œ๊ด€ ์ฑ… ๋Œ€์—ฌ ์„œ๋น„์Šค(์ง์ ‘ ๊ตฌํ˜„, Readme ์ฐธ๊ณ )

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

๐Ÿ“š ๋„์„œ๊ด€ ์ฑ… ๋Œ€์—ฌ ์„œ๋น„์Šค

Contents

  1. ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ
  2. ์ฃผ์š” ์‚ฌ์šฉ ๊ธฐ์ˆ 
  3. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ
  4. ํ”„๋กœ์ ํŠธ ์‹คํ–‰
  5. ์ „์ฒด ํ”„๋กœ์ ํŠธ ์ผ์ •
  6. ๊ธฐ๋Šฅ ์ƒ์„ธ ์†Œ๊ฐœ
  7. ์–ด๋ ค์› ๋˜ ์ ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
  8. ๋Š๋‚€ ์ 

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๋„์„œ๊ด€์˜ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž…, ๋„์„œ ๋Œ€์—ฌ, ๋ฐ˜๋‚ฉ, ๊ฒ€์ƒ‰, ์กฐํšŒ, ๋Œ“๊ธ€ ์ž‘์„ฑ ๊ธฐ๋Šฅ ๋“ฑ ์ œ๊ณต

์ฃผ์š” ์‚ฌ์šฉ ๊ธฐ์ˆ 

  • Flask
  • SQLAlchemy + Migrate
  • PyMySQL + MySQL
  • Marshmallow
  • Flask-RESTX
  • HTML + Flask Jinja2 + Bootstrap
  • JQuery
  • Azure VM (OS: Ubuntu LTS 18.04)
  • Black

ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

๊ธฐ๋Šฅ ๋Œ€์‹  ๊ณ„์ธต ์œ„์ฃผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค.

image

์„ธ๋ถ€ ๊ตฌ์กฐ

// ๊ฐ ํŒจํ‚ค์ง€๋ณ„ __init__.py๋Š” ์ƒ๋žต

elice_library
 โ”œโ”€ static: css, js, images ํŒŒ์ผ ๊ด€๋ฆฌ
 โ”œโ”€ templates: html ํŒŒ์ผ ๊ด€๋ฆฌ
 โ”œโ”€ database  
 โ”‚    โ””โ”€ config.py: db ์ธ์Šคํ„ด์Šค
 โ”œโ”€ domain
 โ”‚    โ”œโ”€ models
 โ”‚    โ”‚    โ”œโ”€ user.py: User ๋ชจ๋ธ ์ •์˜
 โ”‚    โ”‚    โ”œโ”€ book.py: Book ๋ชจ๋ธ ์ •์˜
 โ”‚    โ”‚    โ””โ”€ [...].py: ๊ทธ ์™ธ ๋ชจ๋ธ ์ •์˜
 โ”‚    โ””โ”€ schemas
 โ”‚         โ”œโ”€ user_schema.py: User ์Šคํ‚ค๋งˆ ์ •์˜	  
 โ”‚         โ””โ”€ [...].py: ๊ทธ ์™ธ ์Šคํ‚ค๋งˆ ์ •์˜
 โ”œโ”€ services
 โ”‚	  โ”œโ”€ user_service.py: User ๋ชจ๋ธ๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง ์ˆ˜ํ–‰
 โ”‚	  โ”œโ”€ book_service.py: Book ๋ชจ๋ธ๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง ์ˆ˜ํ–‰
 โ”‚	  โ””โ”€ [...].py: ๊ทธ ์™ธ service
 โ”œโ”€ controllers
 โ”‚	  โ”œโ”€ user_controller.py : User๊ณผ ๊ด€๋ จ๋œ HTTP request ํ•ธ๋“ค๋ง
 โ”‚	  โ”œโ”€ book_controller.py : Book๊ณผ ๊ด€๋ จ๋œ HTTP request ํ•ธ๋“ค๋ง
 โ”‚	  โ””โ”€ [...].py: ๊ทธ ์™ธ controller
 โ”œโ”€ utils
 โ”‚	  โ”œโ”€ config : ์•ฑ config
 โ”‚	  โ””โ”€ errors.py : error ํด๋ž˜์Šค ์ •์˜
 โ”œโ”€ __init__.py : create_app ํ•จ์ˆ˜ ์ •์˜
 โ””โ”€ routes.py : Namespace๋ณ„ api routes ์—ฐ๊ฒฐ

ํ”„๋กœ์ ํŠธ ์‹คํ–‰

ํ”„๋กœ์ ํŠธ ์„ค์น˜

git clone https://kdt-gitlab.elice.io/001_part2_project-library/team1/elice-library.git

ํ™˜๊ฒฝ ๊ตฌ์ถ•

python -m venv venv // ๊ฐ€์ƒ ํ™˜๊ฒฝ ํด๋” ์ƒ์„ฑ

source venv/[Scripts|bin]/activate // ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ ‘์†

pip install -r requirements.txt // ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜

๋ฐ์ด๋ฒ„๋ฒ ์ด์Šค ์„ค์ •

// elice_library/utils/config.py
// ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •
// ํ˜น์€ .env ํŒŒ์ผ ์ด์šฉ

SECRET_KEY = [์‚ฌ์šฉ์ž ๊ณ ์œ  ๋น„๋ฐ€ํ‚ค ์ง€์ •]
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{user}:{pw}@{host}:{port}/{db}?	
                            charset=utf8'.format(
                                user = [์‚ฌ์šฉ์ž MySQL ๊ณ„์ •],
                                pw = [์‚ฌ์šฉ์ž MySQL ๋น„๋ฐ€๋ฒˆํ˜ธ],
                                host = [์‚ฌ์šฉ์ž host],
                                port = [์‚ฌ์šฉ์ž port],
                                db = [์‚ฌ์šฉ์ž db ์ด๋ฆ„] 
                            )

SQLALCHEMY_TRACK_MODIFICATIONS = False

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”

flask db init  // migrations ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
flask db migrate  // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝ
flask db update  //  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐฑ์‹ 

์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์„ธํŒ…

python load_data.py

์„œ๋ฒ„ ์‹คํ–‰

python run.py

์ „์ฒด ํ”„๋กœ์ ํŠธ ์ผ์ •

1์ฃผ์ฐจ (2/23 ~ 2/27)

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (์•„๋ž˜ ๊ธฐ๋Šฅ ์ƒ์„ธ ์†Œ๊ฐœ ์ฐธ๊ณ )

    ํšŒ์›๊ฐ€์ž…
    ๋กœ๊ทธ์ธ / ๋กœ๊ทธ์•„์›ƒ
    ๋Œ€์—ฌํ•˜๊ธฐ
    ๋ฐ˜๋‚ฉํ•˜๊ธฐ
    ๋Œ€์—ฌ ๊ธฐ๋ก
    ๋ฐ˜๋‚ฉ ๊ธฐ๋ก
    ์ฑ… ๋ชฉ๋ก ํŽ˜์ด์ง€
    ์ฑ… ์†Œ๊ฐœ ํŽ˜์ด์ง€
    ๋Œ“๊ธ€ ์ž‘์„ฑ

  • ๊ฐ„๋‹จํ•œ UI/UX ์ž‘์—…

2์ฃผ์ฐจ (3/2 ~ 3/8)

  • ๋ชจ๋“ˆํ™” / ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ ๋ฆฌํŒฉํ† ๋ง (์œ„์˜ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์ฐธ๊ณ )

  • ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

    ๋Œ“๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ
    ๋„์„œ ๊ฒ€์ƒ‰
    ๋„์„œ ํ‰์  ์ฐจํŠธ
    ์ถœ๊ฐ„์ผ, ํ‰์ , ๋Œ€์—ฌํšŸ์ˆ˜, ๋Œ“๊ธ€ ๊ฐœ์ˆ˜ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ฑ… ๋ชฉ๋ก ํ™•์ธ
    ์ฑ… ์ถ”์ฒœํ•˜๊ธฐ ๋ฐ ์ฐœํ•˜๊ธฐ
    ๊ฐœ์ธ ๋งž์ถค ์ •๋ณด ํ™•์ธ (๋‚ด๊ฐ€ ์ฐœํ•œ ๋„์„œ, ์ถ”์ฒœํ•œ ๋„์„œ, ๋Œ“๊ธ€ ๋‚จ๊ธด ๋„์„œ ๋ชฉ๋ก ํ™•์ธ)
    ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
    ํšŒ์› ํƒˆํ‡ด

  • UI/UX ์ˆ˜์ • ๋ฐ ๋ณด์™„

๊ธฐ๋Šฅ ์ƒ์„ธ ์†Œ๊ฐœ

ํšŒ์›๊ฐ€์ž…

  • ์•„์ด๋””(์ด๋ฉ”์ผ), ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฆ„์€ ํ•„์ˆ˜ ์ž…๋ ฅ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ์•„์ด๋””๋Š” ์ด๋ฉ”์ผ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์€ ํ•œ๊ธ€, ์˜๋ฌธ์œผ๋กœ๋งŒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ์˜ ๊ฐ’์ด ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์˜๋ฌธ, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž 3์ข…๋ฅ˜ ์ด์ƒ์„ ์กฐํ•ฉํ•˜์—ฌ ์ตœ์†Œ 8์ž๋ฆฌ ์ด์ƒ์˜ ๊ธธ์ด๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ

  • ์•„์ด๋””(์ด๋ฉ”์ผ)์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ์•„์ด๋””๋Š” ์ด๋ฉ”์ผ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธํ•œ ์œ ์ €๋Š” session์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์•„์›ƒ

  • ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๋กœ๊ทธ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์•„์›ƒํ•œ ์œ ์ €๋ฅผ ํ˜„์žฌ session์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ

  • ํ˜„์žฌ DB ์ƒ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ฑ… ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ DB ์ƒ์— ์กด์žฌํ•˜๋Š” ๋‚จ์€ ์ฑ…์˜ ์ˆ˜๋ฅผ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ฑ… ์ด๋ฆ„์„ ํด๋ฆญ ์‹œ ์ฑ… ์†Œ๊ฐœ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฑ…์˜ ํ‰์ ์€ ํ˜„์žฌ DB ์ƒ์— ๋‹ด๊ฒจ์žˆ๋Š” ๋ชจ๋“  ํ‰์ ์˜ ํ‰๊ท ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. (์ˆซ์ž ํ•œ์ž๋ฆฌ์ˆ˜๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.)
  • ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ํ•œ ํŽ˜์ด์ง€ ๋‹น 8๊ถŒ์˜ ์ฑ…๋งŒ์„ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์ฑ… ์†Œ๊ฐœ / ๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ

  • ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ์ฑ… ์ด๋ฆ„์„ ํด๋ฆญํ•˜์—ฌ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  • ์ฑ…์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋Œ“๊ธ€์ด ๋ณด์ด๋„๋ก sortingํ•˜์—ฌ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ์ฑ…์— ๋Œ€ํ•œ ํ‰๊ฐ€ ์ ์ˆ˜๋ฅผ ๊ธฐ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€ ๋‚ด์šฉ๊ณผ ํ‰๊ฐ€ ์ ์ˆ˜๋Š” ๋ชจ๋‘ โ€œํ•„์ˆ˜ ์ž…๋ ฅโ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ์‚ฌ์šฉ์ž๋Š” ๋™์ผ ์ฑ…์— ํ•œ ๋ฒˆ๋งŒ ํ‰์ ์„ ๋งค๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฑ… ์†Œ๊ฐœ ํŽ˜์ด์ง€์—์„œ๋„ ๋Œ€์—ฌํ•˜๊ธฐ, ์ฐœํ•˜๊ธฐ, ์ถ”์ฒœํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์—ฌํ•˜๊ธฐ

  • ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ๋Œ€์—ฌํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ DB ์ƒ์— ์ฑ…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋Œ€์—ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ DB ์ƒ์— ์ฑ…์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ์ฑ…์„ ๋Œ€์—ฌํ•˜๊ณ  ์ฑ…์˜ ๊ถŒ์ˆ˜๋ฅผ -1 ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ DB ์ƒ์— ์ฑ…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋Œ€์—ฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์ €๊ฐ€ ์ด๋ฏธ ์ด ์ฑ…์„ ๋Œ€์—ฌํ–ˆ์„ ๊ฒฝ์šฐ, ์ด์— ๋Œ€ํ•œ ์•ˆ๋‚ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋‚ฉํ•˜๊ธฐ

  • ๋ฐ˜๋‚ฉํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ฑ…์„ ๋ฐ˜๋‚ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ฑ…์„ ๋ฐ˜๋‚ฉํ•œ ํ›„ DB ์ƒ์— ์ฑ…์˜ ๊ถŒ์ˆ˜๋ฅผ +1 ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์—ฌ / ๋ฐ˜๋‚ฉ ๊ธฐ๋ก

  • ๋กœ๊ทธ์ธํ•œ ์œ ์ €๊ฐ€ ๋Œ€์—ฌํ•œ ์ฑ…์„ ๋ชจ๋‘ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธํ•œ ์œ ์ €๊ฐ€ ๋Œ€์—ฌ ํ›„ ๋ฐ˜๋‚ฉํ–ˆ๋˜ ์ฑ…์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ธฐ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํšŒ์›์ •๋ณด

  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ํšŒ์›๊ฐ€์ž…์‹œ์˜ ๊ฒ€์‚ฌ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ํ›„ ํšŒ์›ํƒˆํ‡ด๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. (์ฑ…์ด ๋ชจ๋‘ ๋ฐ˜๋‚ฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

๋„์„œ ๊ฒ€์ƒ‰

  • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ฑ… ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

์–ด๋ ค์› ๋˜ ์ ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ validation

  • ์ด๋ฆ„์ด ํ•œ๊ธ€ ๋˜๋Š” ์˜์–ด๋กœ๋งŒ ๊ตฌ์„ฑ๋๋Š”์ง€, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜๋ฌธ, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž 3์ข…๋ฅ˜ ์ด์ƒ์„ ์กฐํ•ฉํ•˜์—ฌ ์ตœ์†Œ 8์ž๋ฆฌ ์ด์ƒ์˜ ๊ธธ์ด๋กœ ๊ตฌ์„ฑ๋๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค

> ์ฒ˜์Œ์— ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋ง‰์ƒ ์“ฐ๋ ค๋‹ˆ ์ž˜ ์จ์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์—˜๋ฆฌ์Šค ํ•™์Šต ์ž๋ฃŒ๋ฅผ ๋‹ค์‹œ ๋ณด๊ณ , ๊ตฌ๊ธ€๋ง์„ ํ•˜๋ฉด์„œ ์ •๊ทœํ‘œํ˜„์‹์„ ๋ณต์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.
์ดํ›„ re ํŒจํ‚ค์ง€์˜ ๋ฉ”์†Œ๋“œ(match, search ๋“ฑ)์„ ๊ณต๋ถ€ํ•˜์˜€๊ณ , ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์กฐํ•ฉํ•ด ๊ธฐ๋Šฅ์„ ์™„์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ๋ฆฌ๋ˆ…์Šค VM ์ ‘์† / ํ™˜๊ฒฝ ๊ตฌ์ถ•

  • ๋ฆฌ๋ˆ…์Šค๋ฅผ ๋ฐฐ์šฐ๊ธด ํ–ˆ์ง€๋งŒ ์ž˜ ์‚ฌ์šฉํ•ด๋ณด์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น์–ด๋“ค์ด ์กฐ๊ธˆ ๋‚ฏ์„ค์—ˆ์Šต๋‹ˆ๋‹ค.
    > ์—˜๋ฆฌ์Šค 2์ฃผ์ฐจ ๋•Œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ณ„์† ๋”ฐ๋ผํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ ์ฐจ ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

  • ssh(secure shell)์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
    > ์™ธ๋ถ€ ์ปดํ“จํ„ฐ์— ์ ‘๊ทผํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

  • DB ๊ด€๋ จํ•ด์„œ๋„ ๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    • ๋กœ์ปฌ db๋ฅผ ๊ทธ๋Œ€๋กœ azure์— ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š”์ง€
    • migrations ํŒŒ์ผ์„ git repo์— ์˜ฌ๋ ค์•ผํ•˜๋Š”์ง€ ์˜ฌ๋ฆฌ์ง€ ๋ง์•„์•ผํ•˜๋Š”์ง€
    • ์˜ฌ๋ฆฐ๋‹ค๋ฉด azure์—์„œ git pull๋งŒ ํ•˜๋ฉด ๋๋‚˜๋Š” ๊ฑด์ง€ ๋“ฑ,,

    > ์•„๋ž˜ ์ฝ”์น˜๋‹˜์˜ ์„ค๋ช…์„ ๋“ฃ๊ณ  ๊ถ๊ธˆ์ฆ์„ ํ’€ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    ssh๋กœ azure ์ ‘์† -> mysql server ์„ค์น˜ -> flask app ์„ค์ • -> migrations ์ง„ํ–‰ ๋“ฑ

3. ํ‰์  ์ฐจํŠธ ๊ตฌํ˜„

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ์ค‘, ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ ๊ฐ€๊ฒŒ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๋‹ค๊ฐ€ ์•„๋ž˜ ํ‰์  ์ฐจํŠธ๊ฐ€ ๋ˆˆ์— ๋„์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์„œ๊ด€์˜ ์ฑ…๋„ ๊ฐ€๊ฒŒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋ช…์˜ ๋ณ„์ ์„ ๊ฐ–๊ณ  ์žˆ์œผ๋‹ˆ, ์œ„์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฐจํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณธ ๊ฒฝํ—˜์€ ์—†์–ด์„œ ๊ตฌ๊ธ€๋ง์„ ๋ฐ”๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๊ธฐ์กด ํ˜•์‹์„ ๋จผ์ € ์‚ดํŽด๋ณด๋ฉด, ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋Œ“๊ธ€ ๋ชฉ๋ก์—์„œ ์—ฌ๋Ÿฌ ๋ช…์˜ ๋ณ„์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋Œ“๊ธ€์ด ๋งŽ์•„์กŒ์„ ๋•Œ ๋ณ„์  ๋ถ„ํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

> ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด์„  ํ‹€์ด ํ•„์š”ํ–ˆ๊ณ , ์ €๋Š” Goole Charts์˜ Bar Charts๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ์ฑ…์˜ ๋ณ„์  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ๋ž˜ํ”„์˜ ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋จผ์ €๋Š” book์˜ ๋ชจ๋“  comments๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„, ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ฐ comment์˜ rating(1~5์ )์„ ์–ป์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ฆฌ ๋งŒ๋“  rating list์— rating์„ ๊ฐ๊ฐ ์ ์ˆ˜๋ณ„๋กœ 1๊ฐœ์”ฉ ๋”ํ•ด์ฃผ์–ด ์ „์ฒด ๋ถ„ํฌ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  3. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋ ‡๊ฒŒ ์–ป์€ rating list๋ฅผ ๊ทธ๋ž˜ํ”„์˜ ๋ฐ์ดํ„ฐ๋กœ ๋„ฃ์–ด, ์ตœ์ข…์ ์ธ ๊ทธ๋ž˜ํ”„๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋Š” ์œ„์˜ ๋Œ“๊ธ€ ์‚ฌ์ง„๊ณผ ์—ฐ๋™๋œ ์ฐจํŠธ์ž…๋‹ˆ๋‹ค.

  • ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋“œ์™€ ๋””์ž์ธ์„ ๋” ๊ฐœ์„ ํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋Š๋‚€ ์ 

1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฒ ๋จน์ง€ ๋ง์ž!

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ข‹์•˜๋˜ ๊ฒฝํ—˜ ์ค‘ ํ•˜๋‚˜๋Š”,
ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ์ฐพ์•„๋ณด๊ณ , ์ด๋ฅผ ์Šค์Šค๋กœ ์ ์šฉํ•ด๋ณด์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
(์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋˜๋Š” ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด Marshmallow ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ,
๋น ๋ฅธ REST API ๋นŒ๋”ฉ์„ ์œ„ํ•ด Flask-RESTX ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.)

๋ˆ„๊ตฐ๊ฐ€ ์ž˜ ์ •๋ฆฌํ•œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋”ฐ๋ผ๊ฐ€๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ
๊ณต์‹ ๋ฌธ์„œ์—์„œ ์‹œ์ž‘ํ•ด, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ง์ ‘ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•ด๋ณด์•˜๋Š”๋ฐ
์•„๋ž˜์™€ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์šฐ์„  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ์„ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    2์ฐจ ๊ฐ€๊ณต๋œ ๋ฌธ์„œ๋ณด๋‹ค, ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ ๋ชฉ์ ์„ ๋ถ„๋ช…ํžˆ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ„๋‹จํ•œ ๊ธฐ๋ณธ ์˜ˆ์ œ(Quickstart) ๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ „๋ฐ˜์ ์ธ ๋งฅ๋ฝ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ํŠน์ • ๊ธฐ๋Šฅ์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€, ์ปค์Šคํ…€ ๊ฐ€๋Šฅํ•œ ๋™์ž‘์€ ๋ฌด์—‡์ธ์ง€,
    ์–ด๋””์„œ, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ธ€์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ์‹  ๋ฒ„์ „์ด ๋ฌด์—‡์ธ์ง€, deprecated๋˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด Flask-RESTX์˜ ๊ฒฝ์šฐ, Request Parsing ๊ธฐ๋Šฅ์ด ๊ณง ์ œ๊ฑฐ๋  ์˜ˆ์ •์ด๋ฉฐ, ๋‹ค๋ฅธ ๋ฐฉ์‹(marshmallow)์œผ๋กœ ๋Œ€์ฒด๋  ๊ฒƒ์ด๋ผ๋Š” ์ •๋ณด๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋…์ด ๋˜๊ฒ ์ง€๋งŒ,
ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์•ž์œผ๋กœ๋„ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ ๊ทน ํ™œ์šฉํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค!

2. ๋ฆฌํŒฉํ† ๋ง์€ ์žฌ๋ฐŒ๋‹ค!

์ž‘๋…„ 8์›”, Effective Kotlin 1๊ธฐ ๊ณผ์ •์— ์ฐธ์—ฌํ•˜์—ฌ ์ฒ˜์Œ ๋ฆฌํŒฉํ† ๋ง์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ ,
๊ทธ ๋งค๋ ฅ์— ๊ธˆ๋ฐฉ ๋น ์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์„œ ๋ฐฐ์šด ๋‚ด์šฉ๋“ค์„ ๋– ์˜ฌ๋ฆฌ๋ฉฐ ์ด๋ฒˆ ์ฝ”๋“œ์— ์ ์šฉ์‹œ์ผœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ, ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๊ฐ€ ์ฃผ๋œ ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค.
ํ˜ผ์ž ๋งŽ์€ ๋กœ์ง์„ ๊ฐ๋‹นํ•˜๋˜ views๋ฅผ services์™€ controllers ๋กœ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์™ธ์—๋„ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค์„ ๋‚˜๋ˆ„์—ˆ๊ณ , ๋™์‹œ์— ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋ก UI/UX์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์€ ์—†์—ˆ์ง€๋งŒ
์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์งˆ ๋•Œ๋งˆ๋‹ค ๋ฟŒ๋“ฏํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ–ˆ์„ ๋•Œ ๊ทธ์— ๋”ฐ๋ผ ๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฌ์›Œ์ง„๋‹ค๋Š” ๊ฑธ ๋ชธ์†Œ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.
์ด์ „์—๋Š” DB์— ์ƒˆ๋กœ์šด User๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง์ด, User ๋ชจ๋ธ๊ณผ views.py์— ๊ฑธ์ณ ์žˆ์—ˆ์ง€๋งŒ,
๋ฆฌํŒฉํ† ๋ง ์ดํ›„์—๋Š” user_service์—์„œ๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์•ž์œผ๋กœ ๋””์ž์ธ ํŒจํ„ด ๋“ฑ์„ ๊ณต๋ถ€ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ๋„ ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

3. ์—๋Ÿฌ๋Š” ์นœ๊ตฌ์™€ ์›์ˆ˜ ๊ทธ ์ค‘๊ฐ„ ์–ด๋”˜๊ฐ€...

์ด์ „๊นŒ์ง€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ๋Š˜ ์ŠคํŠธ๋ ˆ์Šค์˜€์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋ฒˆ์— ์ˆ˜๋งŽ์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋“ค์„ ๋งŒ๋‚˜๋ฉด์„œ ์–ด๋Š์ƒˆ ์ €๋„ ๋ชจ๋ฅด๊ฒŒ ์นœ๋ฐ€๊ฐ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์•„์ง๊นŒ์ง€๋Š” ์นœ๊ตฌ๋ณด๋‹จ ์›์ˆ˜์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€์กฐ์ฐจ ๋˜์ ธ์ฃผ์ง€ ์•Š๋Š” css์— ๋น„ํ•˜๋ฉด
๋ฌด์‹ฌํ•˜๊ฒŒ ๋ฉ”์‹œ์ง€๋ผ๋„ ๋˜์ ธ์ฃผ๋Š” ์—๋Ÿฌ์—๊ฒŒ ๊ทธ์ € ๊ฐ์‚ฌํ•œ ๋งˆ์Œ์ด ๋“ญ๋‹ˆ๋‹ค.

์นœ๊ตฌ์™€ ๋งŒ๋‚˜๊ณ  ํ—ค์–ด์ง€๋“ฏ์ด,
์—๋Ÿฌ์™€ ๋งŒ๋‚˜๋ฉด ์•„๋ž˜ ์ •๋ฆฌํ•ด๋‘” ๋‚ด์šฉ ๋˜๋Š” ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ—ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์œ„์ฒ˜๋Ÿผ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์†Œ์ค‘ํ•œ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์ง€๊ฐ์ƒ‰์˜ ์—๋Ÿฌ์— ๋Œ€์ฒ˜ํ•˜๋ฉด์„œ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ์ˆ ๊ณผ ๊ฒฝํ—˜์„ ํ„ฐ๋“ํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค.
์ด์ œ๋Š” ์–ด๋–ค ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋‚˜๋„ ์ด์ „๋ณด๋‹ค ์˜์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

About

๐Ÿ“ Flask, MVC ํŒจํ„ด์„ ํ™œ์šฉํ•œ ๋„์„œ๊ด€ ์ฑ… ๋Œ€์—ฌ ์„œ๋น„์Šค(์ง์ ‘ ๊ตฌํ˜„, Readme ์ฐธ๊ณ )


Languages

Language:HTML 57.5%Language:Python 38.0%Language:CSS 4.1%Language:JavaScript 0.4%