express는 공식 홈페이지에 Node.js를 위한 빠르고 개방적인 간결합 웹 프레임워크
. 라고 나와있지만 와닿지 않는다..
간단한 서버를 express없이 한번 만들어보고 express를 활용해서 만들어 봄으로써
그 활용도를 느껴보자.
//withoutExpress
const http = require('http')
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify({ message: "without express"})
});
server.listen(8000, () => {
console.log('server is running without express')
})
위와 같이 간단한 서버를 간단히 만들어 보았다.
근데 여기서 app의 규모가 커지면, 회원가입, 로그인, 댓글 등 각각의 기능에 따라
응답을 보내줘야하는 로직을 실행하도록 하려면 어떻게 되는지 보자.
기능에 따라 url을 분리하여 각각의 로직이 실행되게 하는것을 라우팅이라고한다.
const http = require('http')
const { sendPosts } = require('./sendPosts')
const server = http.createServer((req, res) => {
const { url, method } = req
res.setHeader('Content-Type', 'application/json')
if (url === '/') return res.send({ message: '/ endpoint' })
if (url === '/signup' && method === 'POS') return res.end(JSON.stringify({ message: '회원가입 완료!' }))
if (url === '/login' && method === 'POST') return res.end(JSON.stringify({ message: '로그인 완료!' }))
if (url === '/products' && method === 'GET') return sendPosts(res)
res.send(JSON.stringify({ message: 'this response answers to every request' }))
})
server.listen(8000, () => { console.log('server is listening on PORT 8000')})
express를 사용하지 않으면 위 코드에서 볼 수 있는것처럼
라우팅을 하기위해서는 req객체로 url과 method를 받아서
조건문으로 각각의 로직이 수행되게 매번 적어줘야한다.
이렇게만 보면 그렇게 불편해보이지 않지만 express를 사용해서 작성한 코드를 보면
express를 사용하는 이유가 납득이 될것이다.
우선 express를 사용하기 위해 express 설치를 한다.
npm install express --save
위 코드를 똑같이 작동하도록 express를 사용해서 작성하면
const http = require('http')
const express = require('express')
const { sendPosts } = require('./postings')
const app = express()
// express 모듈을 임포트한 후 함수를 실행해서 app이란 변수에 담는 것이 컨벤션이라고 한다.
app.use(express.json())
app.get('/', (req, res) => {
res.json({ message: '/ endpoint' })
})
// 1. app에 요청받을 http method를 붙인다.
// 2. 첫번째 인자에는 endpoint url 을 기입하고,
// 3. 각각의 요청에 대해 핸들링 하는 함수를 두번째 인자로 넣습니다.
app.post('/signup', handleSignUp)
app.post('/login', handleLogin)
app.get('/products', sendPosts)
const server = http.createServer(app)
server.listen(8000, () => {
console.log('server is listening on PORT 8000')
})
express를 이용하면
조건문으로 라우팅 처리를 했던것에 비해 훨씬 간편해지고 간결해졌다.
핸들링 함수로 인해서 간결하고 직관적으로 코드를 설계할 수 있게된다.