Node.js 로 CRUD 만들어 보기

1시간 동안 MongoDB 붙여서 30분만에 RESTful API 따라 만들기

NoSQL DB를 붙여서 간단한 REST API 를 작성합니다. Create, Read, Update, Delete 동작에 대한 처리입니다.

MongoDB 를 다운로드해서 PC에 설치할까? 생각하다 살펴보니 MongoDB 클라우드 서비스가 있었습니다.

500MB 용량을 무료로 주고 AWS, Google Cloud Platform, Azure에 배포도 되고 오래 전부터 서비스하고 있었습니다. 가입 후 DB생성을 했습니다. 무료 서비스는 미국 중부 등 몇몇 지역으로 제한되어 있습니다.

DB 생성을 완료하고 터미널에서 접속을 하려니 MongoDB Client가 필요했습니다. 결국 mLab은 대신 mongodb.org 에서 MongoDB Atlas 클라우드 서비스를 이용하기로 했습니다. 개발사에서 제공하는 서비스라 보안에도 신경을 쓰고 최신 버전을 사용하여 서비스를 했고 클라이언트 접속 툴도 제공했습니다.

무료 생성

MongoDB Client Shell 를 다운로드를 합니다.

다운로드 MongoDB Shell

다운로드한 mongo 파일 위치를 터미널의 shell profile 을 열어 PATH에 등록했습니다. 터미널에서 간단히 접속 확인할 수 있게 되었습니다.

MongoDB Compass라는 DB 접속 클라이언트 툴을 제공해서 다운받았습니다.

MongDB Compass 다운로드

비교할 겸 Robomongo가 생각나서 함께 설치했습니다. Robomongo가 3T(MongoChef)를 인수했네요. 무료로 설치할 수 있습니다.

https://robomongo.org/download

Robomongo 다운로드

MongoDB Atlas 와 MongoDB Compass는 연결이 한 번에 잘 됩니다. mLab에 생성한 DB와도 잘 연결됩니다. Robomongo는 MongoDB Atlas와 연결이 실패했습니다. 큰 기능 차이는 써 봐야 알겠지만 첫 인상은 MongoDB Compass 로 시간을 절약하는 게 좋겠습니다.

이제야 개발 환경이 만들어졌습니다.

코딩 시작!

> mkdir restful
> cd restful
> npm init
> npm install express --save
> npm install mongoose --save
> npm install body-parser --save
  • express 모듈은 웹서버 기능이 구현되어 있습니다.
  • mongoose 모듈은 자바스크립트 객체를 MongoDB 객체로 매핑해줍니다.
  • body-parser 모듈은 http 요청 데이터를 파싱하는 미들웨어입니다.

프로젝트는 준비되었고 일단 뭔가 만들어서 서버가 작동되는지 확인하겠습니다.

> vi app.jsvar express = require('express');
var app = express();module.exports = app;

> vi server.jsvar app = require('./app');
var port = process.env.PORT || 3000;var server = app.listen(port, function() {
    console.log('서버 기동 :' + port);
});

> node server.js

지정한 포트로 서버가 잘 구동됩니다.

이제 DB와 연동시켜야 합니다.

> vi db.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://MongoDB Atlas에서 생성한 연결 URL');

vi app.jsvar express = require('express');
var app = express();
var db = require('./db');  // 추가module.exports = app;

이제 User 객체를 정의하고 User 정보에 대한 CRUD 동작을 처리하는 UserController를 작성합니다.

> mkdir user 
> cd user
> vi User.jsvar mongoose = require('mongoose');  
var UserSchema = new mongoose.Schema({  
    name: String,
    email: String,
    password: String
});mongoose.model('User', UserSchema);module.exports = mongoose.model('User');

> vi UserController.jsvar express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');router.use(bodyParser.urlencoded({ extended:true }));var User = require('./User');// User 생성
router.post('/', function(req, res) {
    User.create( {
        name: req.body.name,
        email: req.body.email,
        password: req.body.password
        },
        function(err, user) {
            if (err) return res.status(500).send("User 생성 실패.");
            res.status(200).send(user);
        });
});// User 전체 조회
router.get('/', function(req, res) {
    User.find( {}, function(err, users) {
        if (err) return res.status(500).send("User 전체 조회 실패.");
        res.status(200).send(users);
    });
});// User 조회
router.get('/:id', function(req, res) {
    User.findById(req.params.id, function (err, user) {
        if (err) return res.status(500).send("User 조회 실패");
        if (!user) return res.status(404).send("User 없음.");
        res.status(200).send(user);
    });
});// User 삭제
router.delete('/:id', function (req, res) {
    User.findByIdAndRemove(req.params.id, function (err, user) {
        if (err) return res.status(500).send("User 삭제 실패");
        res.status(200).send("User "+ user.name +" 삭제됨.");
    });
});// User 수정
router.put('/:id', function (req, res) {    
    User.findByIdAndUpdate(req.params.id, req.body, {new: true}, function (err, user) {
        if (err) return res.status(500).send("User 수정 실패.");
        res.status(200).send(user);
    });
});module.exports = router;

UserController 를 route ‘/users’ 과 연결시킵니다.

vi app.jsvar express = require('express');
var app = express();
var db = require('./db');var UserController = require('./user/UserController');  // 추가
app.use('/users', UserController);  // 추가module.exports = app;

서버를 실행하고 테스트를 해 봐야겠지요?

> node server.js

Insomnia REST API 테스트 도구를 사용하여 실행하니 사용자 정보에 대한 CRUD 동작이 모두 잘 응답합니다.

MongoDB Atlas를 사용할 때 갑자기 다음과 같은 에러가 날 때가 있습니다.

리플리카셋에 primary 를 찾을 수 없다고 하며 서버 실행이 실패합니다. MongoDB Atlas에는 DB 접속 whitelist IP를 관리하는게 생각났습니다. 카페로 이동하여 서버 접속을 하니 방화벽에 의해 차단된 경우였습니다. whitelist 에 IP 등록을 하니 해결되었습니다.

이제 산책하러 가야겠습니다.

참조한 글