elice/WIL

[week_07] 3๊ณ„์ธต ์„ค๊ณ„ (3-Layer architecture)

๊ฑด๋ง๋”” 2022. 2. 26. 19:14

1. 3๊ณ„์ธต ๊ตฌ์กฐ๋ž€

  • ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ 3๊ฐœ ๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ

์ถœ์ฒ˜: elice.io

1-1. Controler layer (์ปจํŠธ๋กค๋Ÿฌ)

  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ(request)์„ ๋ถ„์„ํ•œ ํ›„, ์•Œ๋งž์€ ์„œ๋น„์Šค๋กœ ํ•ด๋‹น ์š”์ฒญ์„ ์ „๋‹ฌํ•ด ์ค€ ๋‹ค์Œ, ์„œ๋น„์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์‘๋‹ต (response)ํ•˜๋Š” ์ธต
  • ๋ผ์šฐํŒ… (Routing)์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ธต
  • express์˜ ๊ฒฝ์šฐ, req.params(), req.body(), res.status(), res.send() ์™€ ๊ฐ™์€ ์ฝ”๋“œ ์ž‘์„ฑ

1-2. Service layer (์„œ๋น„์Šค)

  • ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ ์š”์ฒญ์— ๋กœ์ง์„ ์ ์šฉํ•˜๋Š” ์ธต
  • ์˜ˆ) ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ID์˜ ์‚ฌ์šฉ์ž๊ฐ€ DB์— ์กด์žฌํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ , ๊ทธ ํ›„ ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์ผ์น˜์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์„œ ๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋“ฑ์˜ ๋กœ์ง
  • if-else ๋“ฑ์˜ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

1-3. Model layer (๋ฐ์ดํ„ฐ)

  • ์„œ๋น„์Šค ์ธต์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜๋Š” ์ธต
  • Mongoose์˜ ๊ฒฝ์šฐ Model.find({}) ์™€ ๊ฐ™์€ ์ฝ”๋“œ ์ž‘์„ฑ
  • ์œ„์˜ ์˜ˆ์‹œ์—์„œ, 1๏ธโƒฃ์š”์ฒญ์œผ๋กœ ์˜จ ID๊ฐ€ DB์— ์กด์žฌํ•˜๋Š”์ง€, 2๏ธโƒฃ๋งŒ์•ฝ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ๋•Œ DB์ƒ์— ์ €์žฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ๐Ÿ‘‰ ์ด ๋•Œ ์„œ๋น„์Šค ์ธต์€ ๋ฐ์ดํ„ฐ ์ธต์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™•์ธ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
โœจ ํ•œ ์ค„ ์ •๋ฆฌ
Controller ์—์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›๊ณ , ์š”์ฒญ์— ๋Œ€ํ•ด Service ์ธต์—์„œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ณ , ํ•„์š” ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (Model layer)์— ์ ‘๊ทผํ•œ ํ›„, ๊ฒฐ๊ณผ๋ฅผ Controller๊ฐ€ ์‘๋‹ตํ•œ๋‹ค.

 

2. 3๊ณ„์ธต ๊ตฌ์กฐ์˜ ์žฅ์ 

  • ๊ฐ ์—ญํ• ๋ณ„๋กœ ๊ฐœ๋ฐœ ์—…๋ฌด๋ฅผ ๋ถ„๋‹ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ถ„์—…์ด ์šฉ์ดํ•ด์ง„๋‹ค.
  • MVP ๋ณ„๋กœ ๊ฐœ๋ฐœ ์—…๋ฌด๋ฅผ ๋ถ„๋‹ดํ•˜๋Š” ๊ฒฝ์šฐ์—๋„, ๊ฐ MVP๊ฐ€ ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ๊ตฌํ˜„๋˜๋Š”์ง€ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.
  • ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.
  • ์›น ์„œ๋น„์Šค์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ, ํ•ด๋‹น ํด๋”์˜ ์ฝ”๋“œ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๊ธฐ๋Šฅ๋ณ„๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๊ธฐ๋Šฅ๋ณ„๋กœ ํ…Œ์ŠคํŠธ(์œ ๋‹› ํ…Œ์ŠคํŠธ)๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์šฉ์ดํ•ด์ง„๋‹ค.

 

3. 3๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ํด๋” ๊ตฌ์กฐ

middleware, test ํด๋”๋ฅผ ์ œ์™ธํ•˜๋ฉด ํฌ๊ฒŒ routers(=controllers), services, db ํด๋”๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜: elice.io

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

 

 

 

์ฐธ๊ณ 

https://velog.io/@hopsprings2/%EA%B2%AC%EA%B3%A0%ED%95%9C-node.js-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%84%A4%EA%B3%84%ED%95%98%EA%B8%B0