ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋‘ ๋‚จ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์ œ์–ด๊ถŒ์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค.

  • ํ”„๋ ˆ์ž„์›Œํฌ
    • ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ˜ธ์ถœ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๋‚ด๊ฐ€ ํ˜ธ์ถœ

์ด๋Ÿฐ์‹์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‚ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํ˜ธ์ถœํ•˜๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด ์ฝ”๋“œ๋ฅผ ๋Œ€์‹  ํ˜ธ์ถœํ•˜๋Š” ํ˜•์‹์ด๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณต๊ตฌ์„ธํŠธ, ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์กฐ๋ฆฝ์‹ ๊ฐ€๊ตฌ ํ‚คํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์žฅ์ 

ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ธ์ฆ, ๋ผ์šฐํŒ…, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ ์ด๋ฏธ ๊ฒ€์ฆ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ณ  ๋ฒ„๊ทธ๋„ ์ค„์–ด๋“ ๋‹ค.

๋˜ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ •ํ•ด์ง„ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๊ธฐ์— ํŒ€์›๋“ค์ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธํ•˜๋‹ค.


Express

Express๋Š” Node.js์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

Node.js๋งŒ์œผ๋กœ๋„ ์„œ๋ฒ„๋Š” ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ๋ผ์šฐํŒ…, ๋ฏธ๋“ค์›จ์–ด๋“ฑ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ๊ทธ์—๋”ฐ๋ฅธ ๊ฐœ๋ฐœ ์‹œ๊ฐ„๋„ ๋Š˜์–ด๋‚˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ํž˜๋“ค์–ด์ง€๋ฉฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ ์ข‹์ง€์•Š๋‹ค.

ํ•˜์ง€๋งŒ Express๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์šฐํŒ…, ๋ฏธ๋“ค์›จ์–ด, ์š”์ฒญ, ์‘๋‹ต ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ์—๋”ฐ๋ฅธ ๊ฐœ๋ฐœ ์†๋„์™€ ์œ ์ง€๋ณด์ˆ˜ ์ธก์—์„œ๋„ ์ด์ ์ด ์žˆ๋‹ค.


์š”์ฒญ๋ฐ์ดํ„ฐ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ด 3๊ฐ€์ง€์˜ ์ฐจ์ด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์— ๋ถ™์–ด ์žˆ๋А๋ƒ์˜ ์ฐจ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

Query String

URL ๋’ค์— ?key=value ํ˜•ํƒœ๋กœ ๋ถ™๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ์ฃผ๋กœ ๊ฒ€์ƒ‰์–ด, ํ•„ํ„ฐ, ์ •๋ ฌ ์กฐ๊ฑด์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ์ขํžˆ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

/search?q=apple  // apple์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด์ค˜ 

// ์„œ๋ฒ„์—์„œ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• (Express)
req.query.q


URL Parameter

URL Parameter๋Š” ๊ฒฝ๋กœ ์•ˆ์— ํฌํ•จ๋œ ๊ฐ’์ด๋‹ค. ๋ณดํ†ต :id ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ๋ฆฌ์†Œ์Šค (ํŠน์ • ๋Œ€์ƒ)์„ ์ง€์ •(์กฐํšŒ)ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๋‹จ์–ด ์ˆ˜์ •์ด๋‚˜ ์‚ญ์ œ ๋“ฑ์— ์‚ฌ์šฉํ•œ๋‹ค.

/tweets/3   // 3๋ฒˆ ํŠธ์œ— ๊ฐ€์ ธ์™€์ค˜

// ์„œ๋ฒ„์—์„œ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• (Express)
req.params.id  // param๋’ค์— s ๊ผญ ๋ถ™์—ฌ์•ผํ•จ!


Body

Body๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์— ๋‹ด๊ธฐ๋Š” ๋ฐ์ดํ„ฐ๋กœ, ์ฃผ๋กœ JSON ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ JSON์ด๋ž€ JavaScript Object Notation์˜ ์•ฝ์ž์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ตํ™˜ํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ‘œ์ค€์ด๋‹ค.

์ฃผ๋กœ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๊ธ€ ์ž‘์„ฑ, ๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋“ฑ์˜ ์ƒ์„ฑ์ด๋‚˜ ์ˆ˜์ • ๋ฐ์ดํ„ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

{
  "name": "node"   
  // name ๊ฐ’์„ node๋กœ ์ €์žฅ
}

// ์„œ๋ฒ„์—์„œ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• (Express)
req.body.name

์‘๋‹ต ๋ฉ”์„œ๋“œ

Express์—์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค์ด๋‹ค.

  • res.send()
    • ๋ฌธ์ž์—ด/HTML ์ „์†ก
    • res.send(โ€˜Hiโ€™)
  • res.json()
    • JSON(API) ์ „์†ก
    • res.json({data:twt})
  • res.sendFile()
    • ํŒŒ์ผ ์ „์†ก
    • res.sendFile(โ€˜file.pdfโ€™)
  • res.redirect()
    • ๋‹ค๋ฅธ URL๋กœ ์ด๋™ ์ง€์‹œ
    • res.redirect(โ€˜/loginโ€™)
      • ๋กœ๊ทธ์ธ ์•ˆํ•œ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ผ ๋•Œ ๋“ฑ์— ์‚ฌ์šฉ
  • res.status()
    • ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ HTTP ์ƒํƒœ ์ฝ”๋“œ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ
    • res.status(404).json({ message: โ€˜Not Foundโ€™ })
      • ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์—ˆ๋‹ค
      • ์„œ๋ฒ„๊ฐ€ ๊ณต์‹์  ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ

HTTP ์ƒํƒœ ์ฝ”๋“œ

์œ„์˜ res.status()์—์„œ ๋‚˜์˜จ HTTP ์ƒํƒœ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ ์–ด๋ณธ๋‹ค.

HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” 3๊ฐ€์ง€ ์ˆซ์ž๋กœ, ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ ์˜๋ฏธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

2๋Š” ์„ฑ๊ณต, 4๋Š” ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜(์š”์ฒญ์ž˜๋ชป), 5๋Š” ์„œ๋ฒ„ ์˜ค๋ฅ˜๋‹ค.

  • ์ž์ฃผ ์“ฐ๋Š” ์ƒํƒœ์ฝ”๋“œ
    • 200 : ์„ฑ๊ณต
    • 201 : ์ƒ์„ฑ ์„ฑ๊ณต
    • 400 : ์ž˜๋ชป๋œ ์š”์ฒญ
    • 401 : ์ธ์ฆ ํ•„์š”
    • 403 : ๊ถŒํ•œ ์—†์Œ
    • 404 : ๋ฐ์ดํ„ฐ ์—†์Œ
    • 500 : ์„œ๋ฒ„ ์˜ค๋ฅ˜

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: