elice/WIL

[week_06] Express.js์™€ REST API | Middleware, JSON, Postman

1. Middleware

1-1. Express.js์˜ Middleware

  • HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด์—์„œ ๋‹จ๊ณ„๋ณ„ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
  • HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰
  • HTTP ์š”์ฒญ์ด ๋“ค์–ด์˜จ ์ˆœ๊ฐ„ ์‹œ์ž‘ โžก HTTP ์‘๋‹ต ๋งˆ๋ฌด๋ฆฌ๋  ๋•Œ ๊นŒ์ง€ ๋ฏธ๋“ค์›จ์–ด ๋™์ž‘ ์‚ฌ์ดํด ์‹คํ–‰

1-2. Middleware ์ž‘์„ฑ๋ฒ•

  • req, res, next๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ
  • req: HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
  • res: HTTP ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
  • next: ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
const logger = (req, res, next) => {
	console.log(`Request ${req.path}`);
    next();
}
  • next() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์ดํด์ด ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜

1-3. Middleware ์‚ฌ์šฉ๋ฒ•

  • ์ ์šฉ๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ / ๋ผ์šฐํ„ฐ / ์˜ค๋ฅ˜์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋ถ„๋ฅ˜ ๊ฐ€๋Šฅ

1) ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฏธ๋“ค์›จ์–ด

  • ๋ฏธ๋“ค์›จ์–ด ์ž‘์„ฑ ํ›„ app ๊ฐ์ฒด์˜ use๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜,
  • app ๊ฐ์ฒด์˜ HTTP method ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ
  • ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋ชจ๋“  ์š”์ฒญ์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
  • HTTP ์š”์ฒญ์ด ๋“ค์–ด์˜จ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ ์šฉ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘

2) ๋ผ์šฐํ„ฐ ๋ฏธ๋“ค์›จ์–ด

  • ๋ฏธ๋“ค์›จ์–ด๊ฐ€ router ๊ฐ์ฒด์— ์ ์šฉ๋˜๋Š” ๊ฒƒ
  • ํŠน์ • ๊ฒฝ๋กœ์˜ ๋ผ์šฐํŒ…์—๋งŒ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
  • app ๊ฐ์ฒด์— ๋ผ์šฐํ„ฐ๊ฐ€ ์ ์šฉ๋œ ์ดํ›„๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘

3) ๋ฏธ๋“ค์›จ์–ด ์„œ๋ธŒ์Šคํƒ

  • use ๋‚˜ HTTP method ํ•จ์ˆ˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋™์‹œ์— ์ ์šฉ
  • ์ฃผ๋กœ ํ•œ ๊ฐœ์˜ ๊ฒฝ๋กœ์— ํŠน์ •ํ•ด์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์ „๋‹ฌ๋œ ์ธ์ž์˜ ์ˆœ์„œ ์ˆœ์œผ๋กœ ๋™์ž‘

4) ์˜ค๋ฅ˜์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด
  • err, req, res, next ๋„ค ๊ฐ€์ง€ ์ธ์ž๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์•ž์„  ๋ฏธ๋“ค์›จ์–ด์—์„œ next ํ•จ์ˆ˜์— ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์‹คํ–‰๋จ
    • ์ด์ „์— ์ ์šฉ๋œ ๋ฏธ๋“ค์›จ์–ด ์ค‘, next์— ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒฝ์šฐ ์ค‘๊ฐ„ ๋ฏธ๋“ค์›จ์–ด๋“ค์€ ๋›ฐ์–ด๋„˜๊ณ  ์˜ค๋ฅ˜์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋œ๋‹ค.

5) ํ•จ์ˆ˜ํ˜• ๋ฏธ๋“ค์›จ์–ด

  • ํ•˜๋‚˜์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ž‘๋™ ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ
  • ex) API ๋ณ„๋กœ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๋‹ค๋ฅด๊ฒŒ ์ œํ•œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

 

2. REST API

  • REST ์•„ํ‚คํ…์ณ๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์›น API
  • API: ์„œ๋น„์Šค๋‚˜ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์— ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ทœ์•ฝ
  • REST: ์›น์—์„œ ์ž๋ฃŒ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ณ

2-1. REST API ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ - HTTP Method์˜ ์‚ฌ์šฉ

  • REST API๋Š” API์˜ ๋™์ž‘์„ HTTP method + ๋ช…์‚ฌํ˜• URL๋กœ ํ‘œํ˜„
  • ex) /posts๋ผ๋Š” URL์ด '๊ฒŒ์‹œ๊ธ€'์ด๋ผ๋Š” ์ž์›์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ, GET/POST/PUT/DELETE์˜ HTTP method์™€ ๊ฒฐํ•ฉํ•˜์—ฌ API ๋™์ž‘ ์ •์˜

2-2. REST API ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ - URL ํ‘œํ˜„๋ฒ•

  • REST API URL์˜ ์ž์›์€ ๋ณต์ˆ˜ํ˜•์œผ๋กœ ํ‘œํ˜„
  • ํ•˜๋‚˜์˜ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ => ๋ณต์ˆ˜ํ˜• + ์•„์ด๋””
  • ex) /posts/1

2-3. REST API ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ - ๊ณ„์ธต์  ์ž์›

  • REST API๋Š” URL์„ ํ†ตํ•ด ์ž์›์„ ๊ณ„์ธต์ ์œผ๋กœ ํ‘œํ˜„
  • ex) /users/1/posts = 1๋ฒˆ ์œ ์ €์˜ ๊ฒŒ์‹œ๊ธ€ ์ „์ฒด

REST API์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์— ์ •๋ฆฌํ•ด ๋‘์—ˆ๋‹ค.

 

3. JSON

  • ์›น API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ํ‘œํ˜„์‹์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ
  • ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์›น API๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด JSON์„ ์‚ฌ์šฉ
  • Object => { "key" : value } ๋กœ ํ‘œํ˜„
  • Array => [ item1, item2 ] ๋กœ ํ‘œํ˜„

 

4. Express.js.๋กœ REST API ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿ”น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด Node.js ๋ชจ๋“ˆ ํ™œ์šฉ
๐Ÿ”น ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ์˜ ์ž‘์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ, ํ™•์ธ๊ธฐ๋Šฅ API ๊ตฌํ˜„
๐Ÿ”น express-generator๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  MVC ํŒจํ„ด ๊ตฌํ˜„

4-1. MVC ํŒจํ„ด

  • Model - View - Controller
  • ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•

1) Model

  • ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ทธ ์ž์ฒด
  • ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ, ์“ฐ๊ธฐ๋Š” Model์„ ํ†ตํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ง€๋„๋ก ๊ตฌ์„ฑ

2) View

  • ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ
  • Controller์— ์˜ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ , ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ

3) Controller

  • Model์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์„œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ View๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ
  • ์›น ์„œ๋น„์Šค์—์„œ๋Š” ์ฃผ๋กœ ๋ผ์šฐํŒ… ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

4-2. ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ์‚ฌํ•ญ

  • JavaScript์˜ Array ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  • router์™€ route handler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ, ์‘๋‹ต ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  • ์˜ค๋ฅ˜์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ตฌํ˜„
  • ์ •์˜๋˜์ง€ ์•Š์€ ๋ผ์šฐํŒ…์— ๋Œ€ํ•ด 404 ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

 

5. Postman

  • API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ
  • HTTP ์š”์ฒญ์„ ์†์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Œ
  • API๋ฅผ ๋ฌธ์„œํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๋ฐ ๋‹ค์–‘ํ•œ ๋„๊ตฌ ์ œ๊ณต

5-1. Postman์œผ๋กœ API ๋ฌธ์„œํ™”ํ•˜๊ธฐ

  • collection๋งŒ๋“ค๊ธฐ
  • api request ๋งŒ๋“ค๊ธฐ
  • document ์ž‘์„ฑํ•˜๊ธฐ
  • ์ „์ฒด ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ

5-2. Postman์œผ๋กœ API ํ…Œ์ŠคํŠธํ•˜๊ธฐ

  • HTTP Method ์„ค์ •ํ•˜๊ธฐ
  • query param ์‚ฌ์šฉํ•˜๊ธฐ
  • path variable ์‚ฌ์šฉํ•˜๊ธฐ
  • body ์‚ฌ์šฉํ•˜๊ธฐ