본문 바로가기
C++ 200제/코딩 IT 정보

Node.js + Express + MongoDB 초간단 API

by vicddory 2020. 2. 28.

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 개발을 수행합니다.


  1. 초기 설정
  2. DB 관련 설정
  3. 경로 설정
  4. 컨트롤러 설정
  5. API 쌓아 올리기
  6. 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로 변경.




댓글