[Node.js] ๐Ÿ“š Express ๋””์ž์ธ ํŒจํ„ด (MVC, ๋ชจ๋“ˆํ™”)

ํ—ˆํƒœ๋ฆผยท2024๋…„ 5์›” 24์ผ
0

๐Ÿ“š ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

๋””์ž์ธ ํŒจํ„ด์ด๋ž€ ๊ธฐ์กด ํ™˜๊ฒฝ ๋‚ด์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๋ฌธ์ œ๋“ค์„ ์–ด๋–ป๊ฒŒ ํ’€์–ด๋‚˜๊ฐˆ ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์†”๋ฃจ์…˜ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰ ๋””์ž์ธ ํŒจํ„ด์€ ์„ค๊ณ„์ž๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ์„ค๊ณ„๋ฅผ ๋นจ๋ฆฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ.

๋””์ž์ธ ํŒจํ„ด์ด ์ง€์ผœ์ง€์ง€ ์•Š์€์ฑ„ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ํ›„์— ์œ ์ง€๋ณด์ˆ˜, ๊ฐ€๋…์„ฑ, ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŸข MVC ํŒจํ„ด

๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜.

Node.js Express์—์„œ๋Š” MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

Moder, View, Controller์˜ ์•ฝ์ž๋กœ,
ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๊ทธ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์„ธ๊ฐ€์ง€์˜ ์—ญํ• ๋กœ ๊ตฌ๋ถ„ํ•œ ํŒจํ„ด์ด๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” controller์™€ view๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๋ฐ

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด controller๋Š” view์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

Controller

  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์‘๋‹ต์„ ํ•จ
    • ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆญํ•˜๊ณ , ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ "์ด๋ฒคํŠธ"๋“ค์„ ์ฒ˜๋ฆฌ
  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๊ฐ€์ง
    1. ๋ชจ๋ธ์ด๋‚˜ ๋ทฐ์— ๋Œ€ํ•ด์„œ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    2. ๋ชจ๋ธ์ด๋‚˜ ๋ทฐ์˜ ๋ณ€๊ฒฝ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด์•ผ ํ•œ๋‹ค.

Model

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ฐ€๊ณต์ด ์ด๋ค„์ง
  • client์— ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ
  • ์—ฐ์‚ฐ์ฒ˜๋ฆฌ, DB ์ฒ˜๋ฆฌ๊ฐ€ ์ฃผ ๋ชฉ์ 
  • ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๊ฐ€์ง
    1. ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ์ง‘ํ•˜๊ธธ ์›ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    2. ๋ทฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ์ •๋ณด๋„ ์•Œ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
    3. ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด, ๋ณ€๊ฒฝ ํ†ต์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

View

  • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • ์ฆ‰, ๋ฐ์ดํ„ฐ ๋ฐ ๊ฐ์ฒด์˜ ์ž…๋ ฅ, ๊ทธ๋ฆฌ๊ณ  ๋ณด์—ฌ์ฃผ๋Š” ์ถœ๋ ฅ์„ ๋‹ด๋‹น
  • ๋ทฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๊ฐ€์ง
    1. ๋ชจ๋ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    2. ๋ชจ๋ธ์ด๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ๋ชฐ๋ผ์•ผ ๋œ๋‹ค.
    3. ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ๋ณ€๊ฒฝํ†ต์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๐ŸŒฒ MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์˜€์„ ๋•Œ์˜ ์žฅ์ 

์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํŽ˜์ด์ง€, ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์ด 2๊ฐ€์ง€๋ฅผ ์ค‘๊ฐ„์—์„œ ์ œ์–ดํ•˜๋Š” ์ปจํŠธ๋กค, ์ด 3๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜๋Š” ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋ฉด ๊ฐ๊ฐ ๋งก์€๋ฐ”์—๋งŒ ์ง‘์ค‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ณต์žฅ์—์„œ๋„ ํ•˜๋‚˜์˜ ์—ญํ• ๋“ค๋งŒ ๋‹ด๋‹น์„ ํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์„œ ํšจ์œจ์ ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ๊ฐ์ž์˜ ์—ญํ• ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋”ํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ ๋‹ค๋ฉด, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ณ , ์ค‘๋ณต์ฝ”๋”ฉ์ด๋ผ๋Š” ๋ฌธ์ œ์  ๋˜ํ•œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•œ MVCํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ฆ‰ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

  1. ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ layer๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด ๋ช…ํ™•

    • ์ด๋Š” ๊ฐ๊ฐ์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„. โ†’\rightarrow ํšจ์œจ์ ์ธ ์—…๋ฌด
    • ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๋ฏ€๋กœ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์š”์ธ ์ง€์ ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ
  2. ์ •ํ•ด์ง„ protocol์ด ์žˆ๋‹ค๋ฉด ๊ฐ layer๋Š” ๋…์ž์ ์œผ๋กœ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅ

    • ํ˜‘์—… ๋ฐ ์œ ์ง€๋ณด์ˆ˜, ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ์— ์šฉ์ด
    • ํ•œ layer์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋‹ค๋ฅธ layer์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
    • layer๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ layer๋ณ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅ

๐ŸŸข Express ๋””์ž์ธ ํŒจํ„ด

View๋Š” FrontEnd์— ๋งก๊ธฐ๊ณ , ์šฐ๋ฆฌ๋Š” Model๊ณผ Controller์— ์ง‘์ค‘ํ•˜๋ฉด ๋œ๋‹ค.

์ผ๋ฐ˜์ ์ธ Express ๋””์ž์ธ ํŒจํ„ด ์˜ˆ์‹œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

src
โ”‚   app.js          # App entry point
โ””โ”€โ”€โ”€api             # Express route controllers for all the endpoints of the app
โ””โ”€โ”€โ”€config          # Environment variables and configuration related stuff
โ””โ”€โ”€โ”€jobs            # Jobs definitions for agenda.js
โ””โ”€โ”€โ”€loaders         # Split the startup process into modules
โ””โ”€โ”€โ”€models          # Database models
โ””โ”€โ”€โ”€services        # All the business logic is here
โ””โ”€โ”€โ”€subscribers     # Event handlers for async task
โ””โ”€โ”€โ”€types           # Type declaration files (d.ts) for Typescript

์ถœ์ฒ˜ : ideal-nodejs-project-structure

โ”œโ”€โ”€ app.js          # ์‹คํ–‰ ์ฃผ์ฒด
โ”œโ”€โ”€ package.json    # yarn ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ
โ”œโ”€โ”€ yarn.lock       # yarn ํŒจํ‚ค์ง€ ์ž ๊ธˆ
โ””โ”€โ”€ src             # ์†Œ์Šค ํด๋”
    โ”œโ”€โ”€ modules         # ์‚ฌ์šฉ์ž ์ง€์ • ๋ชจ๋“ˆ
    โ”œโ”€โ”€ routes          # ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ถ„๋ฆฌ
    โ”œโ”€โ”€ controllers     # API ์š”์ฒญ/์‘๋‹ต ์‹คํ–‰
    โ”œโ”€โ”€ services        # ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต
    โ”œโ”€โ”€ repository      # DB CRUD
    โ””โ”€โ”€ entities        # Model๊ณผ ๋™์ผ

์ถœ์ฒ˜ : express-design-pattern

๐ŸŸข Reference

Bulletproof node.js project architecture ๐Ÿ›ก๏ธ
โ†’\rightarrow https://www.softwareontheroad.com/ideal-nodejs-project-structure/
Express ๋””์ž์ธ ํŒจํ„ด
โ†’\rightarrow https://seongsu.me/skill/express-design-pattern/
MVCํŒจํ„ด์ด๋ž€
โ†’\rightarrow https://m.blog.naver.com/jhc9639/220967034588

profile
ๆณฐๆž— ๐ŸŒณ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด