Express

Express๋ž€

Node.js์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ

// app.ts
import express from 'express';

const port = 3000;

const app = express(); // App ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

app.get('/', (req, res) => {
  res.send('Hello, World@@');
});
 // listen -> ์ง€์ •ํ•œ ํฌํŠธ๋กœ ํด๋ผ์ด์–ธํŠธ ์ ‘์†์„ ๋ฐ›์•„์ฃผ๊ฒ ๋‹ค ์„ ์–ธ! 
app.listen(port, () => {
  console.log(`Server running at http://localhost: ${port}`);
});

URL ๊ตฌ์กฐ

URL ์ฃผ์†Œ๊ฐ€ localhost:3000์ธ ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ URL ์•ž์— http(s)://๋ฅผ ๋ถ™์ด๊ณ , URL ๋’ค์— ๊ฒฝ๋กœ /๋ฅผ ๋ถ™์ธ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ๊ฒฝ์šฐ์˜ URL full path๋Š” 'https://localhost:3000/'๊ฐ€ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ, /๋ฅผ ์ƒ๋žตํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

ts-node

Typescript REPL

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ํ•ด์ฃผ๋Š” ๋„๊ตฌ

npx ts-node app.ts

nodemon

์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ์ž๋™์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ ํ•ด์ฃผ๋Š” ๋„๊ตฌ

npx nodemon app.ts

nodemon๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์„œ๋ฒ„๋Š” ์‹คํ–‰ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ ํ•ด์•ผํ•จ

์ด๋Ÿฐ ๊ท€์ฐฎ์€ ์ž‘์—…์„ nodemon ์ด ํ•ด๊ฒฐํ•ด์ค€๋‹ค.

ts-node ์— ์˜์กด์„ฑ์„ ๊ฐ–๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ๊ฐ™์ด ์„ค์น˜๊ฐ€ ๋˜์žˆ์–ด์•ผ ํ•œ๋‹ค.

res.send

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›์„ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ์ž๋™์œผ๋กœ JSON ๊ฐœ์ฒด๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

app.get('products', (req, res) => {
  const products = [...];
  res.send({products, page: {currentPage: 1, totalPage: 10 })
})

์ „์†ก๋  ๋ฐ์ดํ„ฐ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ๋ธŒ๋ผ์šฐ์ €๋กœ ์ง์ ‘ url์„ ์ž…๋ ฅํ•ด์„œ ํ™•์ธ

  2. ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ํ™•์ธ (curl, http)

curl๋กœ ํ™•์ธ

curl localhost:3000/proudcts

HTTPie๋กœ ํ™•์ธ

HTTP ๋ช…์„ธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์ž์„ธํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

http localhost:3000/products

REST API

"์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ธฐ์กด์— HTTP๋กœ ๊ตฌ์ถ•๋˜์–ด ์žˆ๋˜ ์›น๋“ค๊ณผ ํ˜ธํ™˜์„ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„๊นŒ"

- Roy T. fielding

REpresentational State Transfer, ์›น ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹จ์ˆœํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๋ฉฐ, ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๊ณผ ์–ธ์–ด์— ํ˜ธํ™˜๋˜๋Š” ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์›น API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

REST API ํŠน์ง•

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์— HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉ

  • ์ž์›์„ URI๋กœ ํ‘œํ˜„

  • HTTP Method๋ฅผ ํ†ตํ•ด ์ž์›์„ ์ฒ˜๋ฆฌ

Roy T. fielding์ด ์ œ์‹œํ•œ REST API ์ œ์•ฝ ์กฐ๊ฑด 4๊ฐ€์ง€

RESTful API -> REST ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋Š” API

  • ๋ฆฌ์†Œ์Šค ์‹๋ณ„: ๋ฆฌ์†Œ์Šค๊ฐ€ URI๋กœ ์‹๋ณ„๋˜์•ผ ํ•จ

  • ํ‘œํ˜„์„ ํ†ตํ•œ ๋ฆฌ์†Œ์Šค ์ œ์–ด: ํ‘œํ˜„์„ ํ†ตํ•ด์„œ ์ž์›์„ ์กฐ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

  • ์…€ํ”„ ์„ค๋ช… ๋ฉ”์‹œ์ง€: ์Šค์Šค๋กœ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • HATEOAS: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ํ•˜์ดํผ๋ฏธ๋””์–ด๋ฅผ ํ†ตํ•ด ์ „์ด๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ณดํ†ต REST API์—์„œ๋Š” ์—”๋“œํฌ์ธํŠธ(URI)๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Verb(Method)๋ฅผ ๋Œ€์ž…ํ•˜์—ฌ ์ž์›์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ์ •ํ•œ๋‹ค.

๋Œ€๋ถ€๋ถ„ 4๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜์ง€ ์•Š๊ณ  Resource์™€ HTTP Verb๋งŒ ๋„์ž…ํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ์‚ฌ์šฉ๋จ

์ œ์•ฝ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜์ง€ ์•Š์•„๋„ REST ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ผ๋ถ€ ๊ฐœ๋…๊ณผ ์›์น™์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ํ†ต์šฉ์ ์œผ๋กœ REST API๋ผ ๋ถ€๋ฅด๊ฒŒ ๋จ

HTTP Verb(Method)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ž์›์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•

๋ฆฌ์†Œ์Šค URL: /products

  1. Read (Collection) -> GET /products * Read๋Š” Collection๊ณผ Item(Element)๋กœ ๋‚˜๋‰จ

  2. Read (Item) -> GET /products/{id}

  3. Create (Collection Pattern ํ™œ์šฉ) -> POST /products

  4. Update (Item) -> PUT ๋˜๋Š” PATCH /products/{id}

  5. Delete (Item) =-> DELETE /products/{id}

Collection Pattern in REST API

Collection Pattern์€ HTTP Verb์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ ์ž์›์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ •์˜ํ•˜์—ฌ API์˜ ๊ฐ€๋…์„ฑ๊ณผ ์‚ฌ์šฉ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

Last updated