Node.js + Express + MongoDB 사용하여 API를 만드는 방법을 소개합니다.
작성하는 API에 대한 링크
이 포스트에서 사용하는 주요 기술을 소개합니다. 이외에 사용하는 package 등은 중간에 간단히 설명합니다. 당연히 javascript 지식은 있어야 합니다.
- Node.js : 서버 측에서 움직이는 JavaScript
- Express : Node.js MVC 프레임워크
- MongoDB : NoSQL로 불리는 데이터베이스
전제 조건
여기에선 Node.js와 MongoDB가 설치되어 있는 것이 개발의 전제 조건입니다.
설치되지 않은 분은 아래 링크를 통해 쉽게 설치할 수 있습니다.
Node.js + Express API 만들기 순서
이 포스트에선 아래 순서로 API 개발을 수행합니다.
- 초기 설정
- DB 관련 설정
- 경로 설정
- 컨트롤러 설정
- API 쌓아 올리기
- API 동작 확인
초기 설정
프로젝트 작성
우선 API를 보관하는 디렉터리(프로젝트)를 작성하고 이동합니다.
$ mkdir todoApp
$ cd todoApp
package.json 작성
프로젝트 안에서 다음 명령을 수행하는 package.json을 작성합니다.
package.json에는 프로젝트의 정보를 기재하거나 프로젝트의 dependencies 관리합니다.
$npm init
npm init 실행하면 CLI에서 다음과 같은 질문을 합니다.
기본적으로 지금은 enter 연타로 디폴트로만 설정해도 문제없습니다.
package name: (todoAPP)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
이렇게 하면, 다음과 같은 package.json이 완성됩니다.
package.json
{
"name": "todoapp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
필요 파일의 설정
아래 명령으로 필요한 디렉터리나 파일을 작성합니다.
$ touch server.js
$ mkdir api
$ mkdir api/controllers api/models api/routes
$ touch api/controllers/taskController.js api/models/taskModel.js api/routes/taskRoutes.js
여기까지 하면 다음과 같은 디렉터리로 구성됩니다.
DB 관련 설정
우선 mongoose라는 Node.js 앱에서 MongoDB를 사용하기 위한 라이브러리를 설치합니다.
npm install mongoose --save
그리고, api/models/taskModel.js를 아래와 같은 javascript 파일로 편집합니다.
api / models / taskModel.js
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var TaskSchema = new Schema({
name: {
type: String,
required: "Enter the name of the task"
},
Created_date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model("Tasks", TaskSchema);
각 데이터가 어떻게 구성될 것인가(Schema)를 여기서 설정합니다.
코드를 보면 알 수 있듯이, 각 task 아래 string형의 name과 Date형의 Created_date로 구성되어 있습니다.
경로 설정
루트는 클라이언트의 응답요청(Request) 등에 어떻게 (애플리케이션이) 반응해야 하는지를 정의합니다.
api/routes/taskRoute.js를 아래와 같이 편집합니다.
api / routes / taskRoute.js
module.exports = function(app) {
var taskList = require('../controllers/taskController');
app.route('/tasks')
.get(taskList.all_tasks)
.post(taskList.create_task);
app.route('/tasks/:taskId')
.get(taskList.load_task)
.put(taskList.update_task)
.delete(taskList.delete_task);
};
코드에서도 알 수 있듯이, /tasks에서는 GET 리퀘스트를 받고자 api/controllers/taskController에 정의된 all_tasks를 실행하고, POST 리퀘스트를 받고자 create_task를 실행하도록 설정되어 있습니다.
api/controllers/taskController 함수는 다음에 정의합니다.
컨트롤러 설정
경로로 설정한 함수를 api/controllers/taskController.js javascript 파일로 정의합니다.
CRUD를 채우도록 아래 5개 함수를 정의합니다. 각 함수의 역할은 코드 내의 주석에 기재했습니다.
api/controllers/taskController.js
var mongoose = require("mongoose"),
Task = mongoose.model("Tasks");
// 모든 task 얻음
exports.all_tasks = function(req, res) {
Task.find({}, function(err, task) {
if (err) res.send(err);
res.json(task);
});
};
// 새로운 task 작성
exports.create_task = function(req, res) {
var new_task = new Task(req.body);
new_task.save(function(err, task) {
if (err) res.send(err);
res.json(task);
});
};
// 특정 task 얻기
exports.load_task = function(req, res) {
Task.findById(req.params.taskId, function(err, task) {
if (err) res.send(err);
res.json(task);
});
};
// 특정 task 갱신
exports.update_task = function(req, res) {
Task.findOneAndUpdate(
{ _id: req.params.taskId },
req.body,
{ new: true },
function(err, task) {
if (err) res.send(err);
res.json(task);
}
);
};
// 특정 task 삭제
exports.delete_task = function(req, res) {
Task.remove(
{
_id: req.params.taskId
},
function(err, task) {
if (err) res.send(err);
res.json({ message: "Task successfully deleted" });
}
);
};
API 쌓아 올리기
필요한 패키지 설치
우선 API를 움직이는 데 필요한 아래 2개의 package를 설치합니다.
express는 첫머리에 기재한 대로 Node.js의 MVC 프레임워크입니다.
nodemon은 파일의 변화가 있으면 자동으로 앱을 빌드하는 편리한 package입니다.
$ npm install --save-dev nodemon
$ npm install express --save
server.js에서 API 작성 시작
여기까지 설정하면, Model, Route, Controller을 server.js (javascript)에서 조합하고 API를 실행할 수 있습니다.
server.js를 다음과 같이 설정합시다.
server.js
var express = require("express"),
app = express(),
port = process.env.PORT || 3000,
mongoose = require("mongoose"),
Task = require("./api/models/taskModel"), // 작성한 Model 읽기
bodyParser = require("body-parser");
mongoose.Promise = global.Promise;
mongoose.connect("mongodb://localhost/Tododb");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var routes = require("./api/routes/taskRoutes"); // Route Import
routes(app); //app에 Route 설정
app.listen(port); // app을 특정 port로 listen 설정
console.log("todo list RESTful API server started on: " + port);
API 실행과 동작 확인
API 실행 방법
우선은 아래 명령으로 DB 서버를 열겠습니다.
$ mongod
그리고 터미널에서 다른 탭을 엽니다. 아래 명령으로 API를 움직여 봅시다.
$ npm run start
postman를 사용한 동작 확인 (Node.js + Express + MongoDB 결과)
POST http://localhost:3000/tasks
우선은 데이터를 작성합시다.
Post 리퀘스트. URL을 입력했던 왼쪽의 선택 사항을 Post로 설정하고 json 형식의 데이터로 바꿉니다.
Get http://localhost:3000/tasks
다음에 데이터를 얻어 봅시다.
GET 리퀘스트. URL을 입력한 왼쪽의 선택 사항을 POST에서 GET으로 변경하고 실행해 봅시다.
GET http://localhost:3000/tasks/:id
이번에는 id를 지정하여 필요한 데이터만 얻습니다.
PUT http://localhost:3000/tasks/:id
다음은 한번 등록한 데이터를 Update 합니다.
URL 왼쪽의 선택 사항을 PUT으로 변경.
DELETE http://localhost:3000/tasks/:id
마지막으로 한번 등록한 데이터를 Destroy 합니다.
URL 왼쪽의 선택 사항을 DELETE로 변경.