Express.js
๋ช ์ฌ ยท ๋ฐฑ์๋ ํ๋ ์์ํฌ
์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ REST API๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ์ ๊ณตํ๋ Node.js์ฉ ๋ฏธ๋๋ฉ๋ฆฌ์คํธ ์ ์ฐํ ์น ํ๋ ์์ํฌ โ ๊ฐ๊ฒฐํจ, ์ฑ๋ฅ ๋ฐ ํ์ฅ ๊ฐ๋ฅํ ๋ฏธ๋ค์จ์ด ์ํ๊ณ ๋๋ถ์ JavaScript ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ฌ์ค์ ํ์ค์ผ๋ก ์ฌ๊ฒจ์ง๋๋ค.
Node.js์ ๋ค์ดํฐ๋ธ HTTP ๋ชจ๋ ์์ ๊ตฌ์ถ๋ ๊ฒฝ๋ ์ถ์ํ ๋ ์ด์ด๋ก, ๋ผ์ฐํ , ์์ฒญ ๋ฐ ์๋ต ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค โ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ์ ๋ํ ์์ ํ ์ ์ด๋ฅผ ์ ์งํ๋ฉด์ ๋ช ์ค์ ์ฝ๋๋ก ์์ ํ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
NestJS, Sails.js, LoopBack๊ณผ ๊ฐ์ ์ฃผ์ ํ๋ ์์ํฌ์ ๊ธฐ๋ฐ์ด ๋๋ ๊ธฐ์ ์ ํ ๋ โ Express.js๋ Uber, IBM, Accenture ๋ฐ ์์ฒ ๊ฐ์ ๊ธฐ์ ์์ ๊ฒ์ฆ๋ ์์ ์ฑ๊ณผ ํ์ฅ์ฑ์ผ๋ก ๋งค์ผ ์๋ฐฑ๋ง ๊ฑด์ API ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Express.js๋ Node.js์ฉ ์คํ์์ค ๋ฐฑ์๋ ํ๋ ์์ํฌ๋ก, ์น ์๋ฒ์ RESTful API๋ฅผ ๋น ๋ฅด๊ณ ๊ตฌ์กฐํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ๊ฐ๋ ฅํ ๋ผ์ฐํ ์์คํ , ๋ฏธ๋ค์จ์ด ๊ด๋ฆฌ ๋ฐ ํ ํ๋ฆฟ ์์ง๊ณผ์ ๋ค์ดํฐ๋ธ ํตํฉ์ ์ ๊ณตํฉ๋๋ค. Express.js๋ NPM์์ ์ฃผ๊ฐ 3,000๋ง ํ ์ด์์ ๋ค์ด๋ก๋๋ฅผ ๊ธฐ๋กํ๋ฉฐ ์ธ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ Node.js ํ๋ ์์ํฌ์ ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ด๋ฅผ ํ์คํ JavaScript ์ํคํ ์ฒ์ ๋ฐฑ์๋ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
Express.js๋ JavaScript ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋จ์์ฑ๊ณผ ๊ฐ๋ ฅํจ ์ฌ์ด์ ์ต์ ์ ๊ท ํ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฏธ๋๋ฉ๋ฆฌ์คํธ ์ํคํ ์ฒ๋ก ๋ช ๋ถ ๋ง์ API ์๋ฒ๋ฅผ ์์ํ ์ ์์ผ๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ ๋ฏธ๋ค์จ์ด ์์คํ ์ผ๋ก ํ๋ ์์ํฌ์ ๊ณผ๋ถํ๋ฅผ ์ฃผ์ง ์๊ณ ์ธ์ฆ, ์ ํจ์ฑ ๊ฒ์ฌ, ๋ก๊น ๋ฐ CORS๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. Express.js๋ MongoDB, PostgreSQL, Redis ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฒฝํ๊ฒ ํตํฉ๋๋ฉฐ, ๊ณ ์ฑ๋ฅ ํ์คํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ React ๋ฐ Next.js์ ์ด์์ ์ธ ๋๋ฐ์์ ๋๋ค.
Express.js๋ฅผ ์ค์นํ๋ ค๋ฉด Node.js์ NPM์ด ์ค์น๋์ด ์๋์ง ํ์ธํ ํ `npm init -y`๋ก ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํ์ธ์. ๊ทธ๋ฐ ๋ค์ `npm install express`๋ก Express๋ฅผ ์ค์นํฉ๋๋ค. ์ต์ ์ฝ๋๋ก `app.js` ํ์ผ์ ์์ฑํ์ธ์: `const express = require('express'); const app = express(); app.listen(3000)`. Express ์๋ฒ๊ฐ ์ค๋น๋์์ต๋๋ค. ์ ๋ฌธ์ ์ธ ๊ตฌ์ฑ์ ์ํด ํ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฆ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค: `cors`, ๋ณด์์ ์ํ `helmet`, ์์ฒญ ๋ก๊น ์ ์ํ `morgan`.
NPM ๊ตฌ์ฑ์ ํ๋ก์ ํธ ๋ฉํ๋ฐ์ดํฐ, ์์กด์ฑ ๋ฐ ์คํ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ํํ๋ `package.json` ํ์ผ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ต์ ์ ์๋ดํ๋ `npm init` ๋๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ `npm init -y`๋ก ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ `scripts` ์น์ ์์ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌ์ฑํ์ธ์: `"start": "node app.js"`, `"dev": "nodemon app.js"`. ์ ์ญ ์ค์ (ํ๋ก์, ํ๋ผ์ด๋น ๋ ์ง์คํธ๋ฆฌ)์ ๊ฒฝ์ฐ `npm config set`์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ NPM ๊ตฌ์ฑ์ ๋ชจ๋ ๊ตฌ์กฐํ๋๊ณ ์ฌํ ๊ฐ๋ฅํ ์ ๋ฌธ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ์ ๋๋ค.
NPM ํจํค์ง๋ฅผ ์ค์นํ๋ ค๋ฉด ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ `package.json`์ ์์กด์ฑ์ ์๋์ผ๋ก ์ถ๊ฐํ๋ `npm install ํจํค์ง๋ช ` (๋๋ `npm i ํจํค์ง๋ช `) ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ฐ ์ ์ฉ ์์กด์ฑ(๋ฆฐํฐ, ํ ์คํธ ๋๊ตฌ)์๋ `--save-dev` (๋๋ `-D`) ํ๋๊ทธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ํน์ ๋ฒ์ ์ ์ค์นํ๋ ค๋ฉด: `npm install express@4.18.2`. ์ค์น ์ ์ ํญ์ GitHub์์ ๋ค์ด๋ก๋ ์, ๋ง์ง๋ง ์ ๋ฐ์ดํธ ๋ ์ง ๋ฐ ์คํ ์ด์ ์๋ฅผ ํ์ธํ์ฌ ํจํค์ง์ ์ ๋ขฐ์ฑ์ ๊ฒ์ฆํ์ธ์.
Node.js์์ ๋ฏธ๋ค์จ์ด๋ HTTP ์์ฒญ ์์ ๊ณผ ์๋ต ์ ์ก ์ฌ์ด์ ์คํ๋๋ ํจ์๋ก, `req`(์์ฒญ), `res`(์๋ต) ๋ฐ `next`(๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์ ๋ฌํ๋ ํจ์) ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฏธ๋ค์จ์ด๋ ์์ฒญ์ ์์ ํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ ํจ์ฑ ๊ฒ์ฌํ๊ณ , ์ธ์ฆ์ ํ์ธํ๊ณ , ์ ๊ทผ์ ๋ก๊น ํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ฒ๋ฆฌ ์ฒด์ธ์ ํ์ฑํฉ๋๋ค. ์ด ์ํคํ ์ฒ ํจํด์ Express.js ์ฒ ํ์ ํต์ฌ์ด๋ฉฐ, ๊ฐ ๋ ์ด์ด๊ฐ ๊ณ ์ ํ๊ณ ํ ์คํธ ๊ฐ๋ฅํ ์ฑ ์์ ๊ฐ์ง ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๊ฒ ํฉ๋๋ค.
Express ๋ฏธ๋ค์จ์ด๋ Express.js ํ๋ ์์ํฌ์ ํนํ๋ ํจ์๋ก, ์ต์ข ๋ผ์ฐํธ์ ๋๋ฌํ๊ธฐ ์ ์ ๋ค์ด์ค๋ ๊ฐ ์์ฒญ์ ๊ฐ๋ก์ฑ ์ฒ๋ฆฌํฉ๋๋ค. Express๋ ๋ชจ๋ ๊ฒ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค: ์์ฒญ ๋ณธ๋ฌธ ํ์ฑ(`express.json()`), ์ ์ ํ์ผ ๊ด๋ฆฌ(`express.static()`), ๋ณด์(`helmet`), CORS(`cors`) ๋ฐ ์ค๋ฅ ๊ด๋ฆฌ. `app.use()`๋ก ์์ด๋ฉฐ ์ ์ธ ์์๋๋ก ์คํ๋ฉ๋๋ค. Async Code์์๋ ์ต์ ์ ์ ์ง๋ณด์์ฑ์ ์ํด ๋ฏธ๋ค์จ์ด๋ฅผ ๋ ์ด์ด(๋ณด์, ์ ํจ์ฑ ๊ฒ์ฌ, ๋น์ฆ๋์ค ๋ก์ง, ์๋ต)๋ก ์ค๊ณํฉ๋๋ค.
Express.js๋ฅผ ์ ํํ๋ค๋ ๊ฒ์ ๋ฐฉ๋ํ ์ปค๋ฎค๋ํฐ์ 50,000๊ฐ ์ด์์ ๋ฏธ๋ค์จ์ด ํจํค์ง ์ํ๊ณ๊ฐ ์ง์ํ๋ ์ธ๊ณ์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ JavaScript ๋ฐฑ์๋ ํ๋ ์์ํฌ์ ๊ฒ์ฆ๋ ์์ ์ฑ์ ์ ํํ๋ ๊ฒ์ ๋๋ค. JavaScript ๊ฐ๋ฐ์์๊ฒ ๋ถ๋๋ฌ์ด ํ์ต ๊ณก์ , ๋น๋ ์ ์ ์ํคํ ์ฒ์ ์์ ํ ์ค๊ณ ์์ , ๊ณ ๋ถํ REST API๋ฅผ ์ํ ํ์ํ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Express.js๋ ๋ํ NestJS์ ๊ฐ์ ๋ ๊ตฌ์กฐํ๋ ํ๋ ์์ํฌ์ ๊ธฐ๋ฐ์ด์ด์ ์ต๋ํ ์ญ๋์ด ์ฅ๊ธฐ์ ์ผ๋ก ์ ํจํฉ๋๋ค.
body-parser๋ ๋ค์ด์ค๋ HTTP ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ถ์ํ๊ณ `req.body`๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ Node.js ๋ฏธ๋ค์จ์ด์ ๋๋ค. JSON(`bodyParser.json()`), URL-encoded(`bodyParser.urlencoded()`) ๋ฐ raw/text ํ์์ ์ง์ํฉ๋๋ค. ์ญ์ฌ์ ์ผ๋ก ๋ณ๋์ ํจํค์ง์์ง๋ง, body-parser๋ ๋ฒ์ 4.16๋ถํฐ `express.json()`๊ณผ `express.urlencoded()`๋ฅผ ํตํด Express.js์ ์ง์ ํตํฉ๋์์ต๋๋ค. React๋ Next.js์ ๊ฐ์ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํผ ๋ฐ์ดํฐ๋ JSON ํ์ด๋ก๋๋ฅผ ์์ ํ๋ ๋ชจ๋ ์๋ฒ์ ์ฌ์ ํ ํ์์ ์ ๋๋ค.
๋ค, Express.js๋ 2025๋ ํ์ฌ NPM์์ ์ฃผ๊ฐ 3,000๋ง ํ ์ด์์ ๋ค์ด๋ก๋์ ๋๋ถ๋ถ์ ์ ๋ฌธ JavaScript ์คํ์์์ ์กด์ฌ๊ฐ์ผ๋ก ์ธ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฑ์๋ Node.js ํ๋ ์์ํฌ๋ก ๋จ์ ์์ต๋๋ค. Fastify(๋ฒค์น๋งํฌ์์ ๋ ๋น ๋ฆ)๋ NestJS(๋ ๊ตฌ์กฐํ๋จ)์ ๊ฐ์ ๋์์ด ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ง๋ง, Express.js๋ ๊ทธ ๊ฐ๊ฒฐํจ, ์ฑ์๋ ๋ฐ ๋น๊ตํ ์ ์๋ ์ํ๊ณ ๋๋ถ์ ์ง๋ฐฐ์ ์์น๋ฅผ ์ ์งํ๊ณ ์์ต๋๋ค. Async Code์์๋ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ํ๋ ๋ฐฑ์๋ API์ ํ๋ก๋์ ์์ ์ด๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋๊ท๋ชจ์์๋ ๊ทธ ์์ ์ฑ์ด ๊ณ์ ์ ์ฆ๋๊ณ ์์ต๋๋ค.