September 10, 2019

(JavaScript) ์ˆœ์ˆ˜ ๐ŸŒJS๋กœ ModuleํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ MVCํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ Momentum

๊ณ ๋ช…์šฐ

๋ชจ๋ฉ˜ํ…€ ๋งŒ๋“ค๊ธฐ์ž…๋‹ˆ๋‹ค.

  • Vanilla Js๋กœ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ModuleํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • MVCํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • dateํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์‹œ๊ฐ„์„ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • openWeathermap api๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • api๋ฅผ ํ†ตํ•ด ์–ป์–ด์˜จ ๋‚ ์”จ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ์ด๋ฏธ์ง€์™€ ์˜จ๋„๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • eslint google style
  • es6์ดํ›„ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ ์”จ ์ด๋ฏธ์ง€๋Š” ์ถœ์ฒ˜๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ๋กฌํ™˜๊ฒฝ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„  ์ž‘๋™์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์™„์„ฑ๋œ ๋ชจ์Šต ๐Ÿ˜ƒ

์™„์„ฑํ’ˆ ๋งํฌ

๊นƒํ—ˆ๋ธŒ ์ฝ”๋“œ ๋งํฌ


index.html

  • js/app.js ํŒŒ์ผ์„ type="module"๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • type="module"๋กœ jsํŒŒ์ผ์„ ๋ถ€๋ฅด๋ฉด import๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๊ณ 
  • ๊ฐ ํŒŒ์ผ๋งˆ๋‹ค ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • index.html

js/app.js

  • ์ œ์ผ๋จผ์ € ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • MainController๋ฅผ import ํ•ฉ๋‹ˆ๋‹ค.
  • DOM์ด ๊ทธ๋ ค์ง„ํ›„ MainController.init()์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค
  • js/app.js

js/controllers/MainController.js

  • MVCํŒจํ„ด์—์„œ Controller ๋ถ€๋ธ์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  View ํŒŒ์ผ๋“ค์„ Import ํ•ฉ๋‹ˆ๋‹ค.
  • init()์—์„œ ๋ชจ๋“  ViewํŒŒ์ผ๋“ค์„ setup ํ•ด์ค๋‹ˆ๋‹ค.
  • setup์€ ๊ฐ์ž ๊ตฌํ˜„์ด ๋‹ค๋ฅด์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ this.el์— ๋ณธ์ธ์˜ ๋ฉ”์ธํƒ€๊ฒŸ์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
  • ViewํŒŒ์ผ๋“ค์€ ๊ฐ๊ฐ ์Šค์ฝ”ํ”„์™€ CustomEvent๋ฅผ ๊ฐ–๊ณ ์žˆ์œผ๋ฉฐ
  • .on()์„ ์ด์šฉํ•˜์—ฌ View๋“ค์˜ CustomEvent๋ฅผ ๋ฐ›์œผ๋ ค๊ณ  ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • renderView()๊ฐ€ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•˜๊ณ 
  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ๋งค๋ฒˆ renderView()๋ฅผ ์žฌ์‹คํ–‰ ํ•˜๋Š” ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค.
  • js/controllers/MainController.js

js/models/TodoListModel.js

  • MVCํŒจํ„ด์—์„œ Model ๋ถ€๋ถ„์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • LocalData๋ฅผ ์ €์žฅ ์ˆ˜์ • ๊ฒ€์ƒ‰ ์‚ญ์ œ ํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ํž˜๋“ค์–ด์„œ ๊ธฐ์กด LocalData๋ฅผ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์ˆ˜์ •ํ›„ ๋ณ€์ˆ˜๋ฅผ LocalData๋กœ ์˜ฌ๋ฆฌ๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.
  • DB๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋” ํŽธํ–ˆ์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ ํฌ๋กฌ์—์„œ๋งŒ ์ •์ƒ์ž‘๋™ ํ•ฉ๋‹ˆ๋‹ค.
  • js/models/TodoListModel.js

js/views/View.js

  • ๊ฐ ์—ญํ• ์„ ๋งก์€ ViewํŒŒ์ผ๋“ค์ด ์žˆ์ง€๋งŒ ๋ชจ๋‘ ์ด View.js๋ฅผ ์ƒ์† ๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • init()์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋„˜์–ด์˜จ ํƒ€๊ฒŸ์„ this.el ํ”„๋กœํผํ‹ฐ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • on()์€ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด์„œ CustomEvent๋ฅผ ๋ฐ›๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • emit()์€ CustomEvent๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐฉ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • hide()๋Š” this.elํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋œ ํƒ€๊ฒŸ์˜ css๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • show()๋Š” hide์™€ ๋ฐ˜๋Œ€๋กœ ํ‘œ์‹œ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • js/views/View.js


ํ•  ๋ง โ€๐Ÿ„๐Ÿปโ€

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋„ฃ๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์šฐ์„  toy ํ”„๋กœ์ ํŠธ์ด๊ธฐ์—

ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ Todo์™€ Calendar ๋‘๊ฐ€์ง€๋งŒ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด์ฐจํ”ผ MVCํŒจํ„ด์„ ๋งŒ๋“ ๊ฑฐ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ณ 

๊ตณ์ด ๋ฌด๊ฒ๊ฒŒ ํ• ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์งœ๋ฉฐ ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ๋˜์—ˆ๊ณ  ๋งŒ์•ฝ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๊ธ€์„ ์ฝ๋Š”๋‹ค๋ฉด

ํ•œ๋ฒˆ ์ œ ์ฝ”๋“œ๋ฅผ ๋ฒ ์ด์Šค๋กœ ๋” ๋ฉ‹์ง„ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ ๊ณต๋ถ€์šฉ์ด๊ณ  ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๊ตณ์ด ์˜คํ”ˆํ•˜์ง€ ์•Š๋Š” ๊ธ€์ด๋‹ˆ ์š•ํ•˜์ง€ ๋ง์•„์ฃผ์„ธ์š”

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™