지난 포스팅에서 Node.js를 통해 HTTP 요청과 응답을 받을 수 있는 API 서버를 만들어 보았습니다. 오늘은 Express 프레임 워크를 활용하여 보다 간단하게 서버를 구축하는 방법을 정리하겠습니다.
우선 express를 설치하고 간단한 웹 서버를 만들어 보겠습니다. express를 설치하고 기본 경로를 App.js로 사용하겠습니다. 몇 줄이 안되는 코드로 손 쉽게 get 요청을 구현 할 수 있습니다.
npm install express
// app.js
const express = require('express');
const app = express(); // app 객체
const port = 3000;
app.get('/', (req, res) => {
res.send('Express')
})
app.listen(port, () => {
console.log(`현재 ${port} 포트에서 서버가 작동 중 입니다.`)
}
App.js에서 URL에 따라 분기하여 응답을 보내줄 수 있지만, 웹 페이지 규모가 커지게 되면 그에 따라 서버에서 처리해야하는 로직이 복잡해 집니다. 그렇기 때문에 라우터를 활용하여 url, 기능별로 분기하여 코드를 작성하는 것이 좋습니다.
// lowerRouter.js
const router = express.Router();
router.get('/lower', (req, res) => { // /lower 경로로 get 메소드를 요청하면 콜밸함수 실행
res.json(data); // json() 메소드를 이용하여 직렬화 후 전송
})
router.post('/lower', (req, res) => { // /lower 경로로 post 메소드를 요청하면 콜밸함수 실행
// req.body => { id : 100, name : 'lmh', ...}
data.push(req.body) // 요청 시 전송한 body를 data에 추가합니다.
res.json(data); // json() 메소드를 이용하여 직렬화 후 전송
}
}
위에서는 lowerRouter.js 콜백함수를 통해 직접 로직을 구현했지만 라우터로 분기한 후 컨트롤러에서 라우터 객체가 http 메소드를 호출 할 때 전달받는 콜백함수들을 기능별로 구현할 수 있습니다. 아래의 코드는 discussion이라는 객체 데이터를 조회하고 생성하고 삭제하는 것을 구현한 코드 입니다.
//discussionRouter.js
const { discussionsController } = require("../discussionController");
const express = require("express");
const router = express.Router();
// get 요청
router.get("/", discussionsController.findAll);
router.get("/:id", discussionsController.findById); // id라는 파라미터를 받 습니다.
// POST 요청
router.post("/", discussionsController.create);
// DELETE 요청
router.delete("/:id", discussionsController.delete); // id라는 파라미터를 받 습니다.
module.exports = router;
discussionRouter에서 url과 http 메소드에 따라 분기할 때 마다 사용되는 콜백함수를 객체에 담아 export 합니다.
// discussionController.js
const { Discussions }require("../repository/discussions");
const { v4: uuid } = require("uuid"); // id를 난수로 생성
let newDiscussionData = Discussions
// 컨트롤러 객체
const discussionsController = {
findAll: (req, res) => {
return res.status(200).json(newDiscussionData);
},
findById: (req, res) => {
const { id } = req.params;
const param = Number(req.params.id);
if (req.params !== undefined) {
const filteredData = newDiscussionData.filter((data) => {
return data.id === param;
});
return res.json(filteredData);
}
},
create: (req, res) => {
const discussion_uuid = uuid();
const newDiscussion = Object.assign(req.body, { id: discussion_uuid });
console.log("새로운 게시글이 추가되었습니다.");
console.log(req.body);
newDiscussionData.unshift(newDiscussion);
return res.status(201).json(newDiscussion);
},
delete: (req, res) => {
const { id } = req.params;
const deletedData = newDiscussionData.filter((data) => {
console.log("param : " + req.params.id);
return String(data.id) !== req.params.id;
});
newDiscussionData = deletedData;
console.log("id :" + req.params.id + " / 게시글이 삭제되었습니다.");
return res.status(200).json();
},
};
module.exports = { // 컨트롤러 객체 export
discussionsController,
};
Epress 프레임워크를 사용하여 어떻게 서버를 구현하는지에 대해서 간단하게 정리하였습니다. 다음 포스팅에서는 Express의 미들웨어와 사용되는 메소드의 기능에 대해서 조금 더 자세하게 알아보도록 하겠습니다.