Router์™€ Middleware / Postman

Yeonnยท2024๋…„ 10์›” 28์ผ
0

Backend ๐Ÿ‘€

๋ชฉ๋ก ๋ณด๊ธฐ
2/10
post-thumbnail

โ“Routing

๐ŸŒฑ
ํŠน์ • endpoin์— ๋Œ€ํ•œ ์š”์ฒญ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€๋‹ตํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ
โ†’ ๊ฐ endpoin์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ ์ ˆํ•œ ์‘๋‹ต์„ ์ „๋‹ฌ

โœ”๏ธย endpoint = HTTP method + URI

๐ŸŒฑ
POST /api/users: HTTP method( ํ–‰์œ„ ) + URI( ์ž์› )

โœ”๏ธย App routing

  • Express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
  • get, post, put, delete, allโ€ฆ

โœ”๏ธย Router level routing

  • Express์˜ Router ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • ๋ผ์šฐํ„ฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ… ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌ
    • const usersRouter = Router();
  • app ๊ฐ์ฒด์˜ use ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•ด๋‹น ๋ผ์šฐํ„ฐ ์—ฐ๊ฒฐ
// app.js
app.use('/api/users', usersRouter);
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜: ํ•ด๋‹น ๋ผ์šฐํ„ฐ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ ์ „๋‹ฌ( ๊ธฐ๋ณธ ๊ฒฝ๋กœ ์ œ์™ธํ•˜๊ณ  ์ž‘์„ฑ )
// routes/usersRouter.js
usersRouter.put('/:id', (req, res) => {res.send('edit user')});
  • grouping: ๊ด€๋ จ๋œ ๋ผ์šฐํŠธ๋ฅผ ํ•˜๋‚˜์˜ ๋ผ์šฐํ„ฐ ๊ฐ์ฒด๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌ, ์ฝ”๋“œ ๋ถ„๋ฆฌ

โ“ย Postman

๐ŸŒฑ GET ์š”์ฒญ ์ด์™ธ์˜ ๋‹ค๋ฅธ API ๋„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ !

โœ”๏ธย Path Parameter

๐ŸŒฑ /api/users/:id โ†’ :parameter

GET /api/users/:id 
  • ๋™์  ๋ผ์šฐํŒ…: URI ๊ฒฝ๋กœ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง‘์–ด ๋„ฃ๊ธฐ
  • ์กฐํšŒ: req ๊ฐ์ฒด์˜ params ํ”„๋กœํผํ‹ฐ์—์„œ ํ•ด๋‹น ๊ฐ’ ์กฐํšŒ ๊ฐ€๋Šฅ
    • const { id } = req.params

โœ”๏ธย Query String

๐ŸŒฑ

/api/users?page=2&size=5 โ†’ page: 2, size: 5

GET /api/users?page=2&size=5
  • Query String ์‚ฌ์šฉ: ? ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ฐ ๊ฐ’์€ & ๋กœ ์—ฐ๊ฒฐ
    • key = value ํ˜•ํƒœ
    • const { page, size } = req.query

โ“ย Request Handler

๐ŸŒฑ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜

  • req ๊ฐ์ฒด์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—… ์ˆ˜ํ–‰
  • res ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‘๋‹ต์˜ ํ˜•ํƒœ ๊ฒฐ์ •
  • res ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ( ex. send, render, redirect )๋ฅผ ํ™œ์šฉํ•ด ์ตœ์ข… ์‘๋‹ต ๋ณด๋ƒ„

โœ”๏ธย req

  • req.params: Path Parameter์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ
  • req.queries: Query String์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ
  • req.body: POST, PUT ์š”์ฒญ์— Body์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ
  • req.get(): ์š”์ฒญ์˜ HTTP Header ๊ฐ’์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ
/api/users/:id  // -> Path Parmeter: req.params.id
/api/posts?page=2&size=10 // -> req.queries: req.query.page, req.query.size
/req.get('Authorization') // -> req.get()

โœ”๏ธย res

  • res.send(): text ํ˜•์‹์˜ HTTP ์‘๋‹ต ์ „์†ก
  • res.json(): JSON ํ˜•์‹์˜ HTTP ์‘๋‹ต ์ „์†ก
  • res.render(): HTML Template์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ์ „์†ก
  • res.set(): ์‘๋‹ต์˜ HTTP Header๋ฅผ ์ „์†ก
  • res.status(): ์‘๋‹ต์˜ HTTP Status Code๋ฅผ ์„ค์ •
res.stauts(404).send('User not found');

โ“ย Middleware( โ‰‘ intercepter )

๐ŸŒฑ ์š”์ฒญ โ†’ ์‘๋‹ต์˜ ๊ณผ์ • ์‚ฌ์ด์—์„œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ, chaining ํ˜•ํƒœ

  • use ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฏธ๋“ค์›จ์–ด ์—ฐ๊ฒฐ
    • ๋ฏธ๋“ค์›จ์–ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ด ์ •์˜๋œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
    • app ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ผ์šฐํ„ฐ์— ์—ฐ๊ฒฐํ•˜์—ฌ, ํŠน์ • ๋ผ์šฐํ„ฐ์—์„œ๋งŒ ๊ฑฐ์น˜๋Š” ์ž‘์—…์„ ์ •์˜ ๊ฐ€๋Šฅ
      • ๋ผ์šฐํ„ฐ๋ฅผ ์ด์šฉํ•œ ๊ทธ๋ฃนํ™”์˜ ์žฅ์  !
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋™์‹œ์— ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
      • ์ „๋‹ฌ๋œ ์ธ์ˆ˜์˜ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘
  • ( err, req, res, next )
    app.use((req, res, next) => {
    	req.newProperty = 'Hello World';
    	next();
    });
    • req, res
    • next: ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ€๊ธฐ
      • ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ-์‘๋‹ต ์ฃผ๊ธฐ๊ฐ€ ์ข…๋ฃŒ๋จ
      • ์˜๋„์ ์œผ๋กœ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ( ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๊ถŒํ•œ ์ œ์–ด ๋“ฑ )
        • next ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ Error ๊ฐ์ฒด ์ „๋‹ฌ
          app.use((req, res, next) => {
          	if(!isAdmin(req)) {
          		next(new Error('Not Authorized'));
          		return;
          	}
          	next();
          });
    • err: 4๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ธ์‹
      • ์•ž์„  ๋ฏธ๋“ค์›จ์–ด์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰
      • ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜, ์—๋Ÿฌ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด err ๊ฐ์ฒด ์ „๋‹ฌ

โœ”๏ธย Express: ๋‚ด์žฅ ๋ฏธ๋“ค์›จ์–ด

  • express.static()
    • ์ •์  ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฏธ๋“ค์›จ์–ด
    • ์ •์  ํŒŒ์ผ์ด ์ €์žฅ๋  ํด๋”์˜ ๊ฒฝ๋กœ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
      • ์ •์  ํŒŒ์ผ: ๊ณ ์ •๋œ ์ฝ˜ํ…์ธ : HTML, CSS, JavaScript, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ
    • ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ path๋ฅผ importํ•˜๊ณ  join๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€ ๊ฒฝ๋กœ ๋ฌธ์ž์—ด ์ƒ์„ฑ
      import path from 'path';
      app.use(express.static(path.join(__dirname, 'public')));
  • express.json()
    • ์š”์ฒญ์˜ Body๊ฐ€ JSON ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•˜์ง€ ์•Š์Œ
      • express.json() ์„ ์—ฐ๊ฒฐํ•˜์—ฌ JSON ํ˜•ํƒœ์˜ Body๋ฅผ ์ž๋™์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑ
  • express.urlencoded()
    • ์š”์ฒญ์˜ Body๊ฐ€ HTML Form์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•˜์ง€ ์•Š์Œ
    • express.urlencoded() ์„ ์—ฐ๊ฒฐํ•˜์—ฌ JSON ํ˜•ํƒœ์˜ Body๋ฅผ ์ž๋™์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑ

โœ”๏ธย ๋ฏธ๋“ค์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ( express ๋‚ด์žฅ ์™ธ )

  • morgan
    • npm i morgan
    • ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ํ˜•์‹ ์ง€์›

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