ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10장 mongoose (몽구스) 를 이용한 MongoDB 스키마 생성, CRUD 작업 (1)
    MeanStack (deprecated) 2016. 6. 16. 00:40



    이번엔 mongoose 를 이용해서 MongoDB 스키마를 만들어보겠다. 

    MongoDB는 collection 을 사용해 데이터를 저장하기 때문에 궂이 스키마를 정의해 document 의 구조가 동일하게

    만들 필요는 없지만, 살아가다 보면 종종(?) document 가 유사 할 필요가 있다. 

    mongoose 는 Schema 객체를 사용해 MongoDB의 Model 을 정의한다. 

    그럼 바로 Schema를 정의해보자. 


    새로운 Model 을 정의하기 위해 app/models 폴더로 가서 user.server.model.js 파일을 생성하고 , 코드를 작성하자.


    var mongoose = require('mongoose'),
         Schema = mongoose.Schema; 
    
    var UserSchema = new Schema({
          username : String , 
          userid : String ,
          password : String , 
          email : String 
    });
    
    mongoose.model('User', UserSchema);
    
    


    먼저 mongoose 의 Schema 생성자를 통해서 UserSchema 객체를 정의하고 User 모델을 정의하기 위해 

    UserSchema 를 이용하였다. 이제 이 모델을 사용하기 위해 mongoose 환경 구성파일에 User 모델을 등록해보자.

    config 폴더로가서 mongoose.js 파일을 수정하자. 


    var config = require('./config'),
         mongoose = require('mongoose');
    
    module.exports = function() {
       var db = mongoose.connect(config.db);
    
       require('../app/models/user.server.model.js');
       return db;
    }
    


    중간에 require('../app/models/user.server.model.js') 를 넣어서 mongoose 로 정의한 모델을 적용시켰다. 

    이제 이 모델을 이용하여 CRUD 작업을 해보자. 

    사용자에 관련된 CRUD 작업을 정리하기 위해 Users 컨트롤러를 만드는 것 이 바람직하다. 

    app/controllers 폴더에 users.server.controller.js 파일을 만들고 여기에 코드를 넣자.


    var User = require('mongoose').model('User');
    
    exports.create = function(req,res,next) {
        var user = new User(req.body);
    
        user.save(function(err){
            if(err) {
                return next(err);
            } else {
                res.json(user);
            }
        });
    };
    


    먼저 mongoose 모듈을 사용해서 정의해 두었던 User 모델을 불러온다. 그리고 create 라는 컨트롤러 메소드를 

    만들어서 새로운 User 인스턴스 ,즉  User 에 정의된 스키마에 맞춘 새로운 document 형식을 만들고 거기에는

    request.body 데이터를 넣을 것 이다. 

    그리고 mongoDB 의 세이브 명령어를 사용해 mongoDB에 저장할 것 이고 에러가 난다면 next(err) 오류를 

    다음 미들웨어로 넘기고, 에러가 없다면 저장된 데이터를 json 방식으로 응답할 것 이다. 


    이제 컨트롤러를 만들었으니 사용자가 사용할 때 해당 컨트롤러로 길을 인도할 라우팅 집합을 만들어보자.

    app/routes 폴더로 가서 users.server.routes.js 파일을 만들고 코드를 작성하자.


    var users = require('../../app/controllers/users.server.controller');
    
    module.exports = function(app) {
        app.route('/users').post(users.create);
    };
    
    


    먼저 위에 정의했던 컨트롤러를 불러오고 express 의 라우팅 기능으로 post 형식으로 /users 로 들어오면 

    컨트롤러의 create 메소드를 실행하도록 되어있다. 

    나중에 angular.js 를 위해서 주로 RESTful API 형태로 서비스 하기 때문에, REST 원칙에 맞춰 라우팅 구성을

    맞춰야 한다. 

    config 폴더로 가서 express_config.js 를 수정하여 보자. 


    var express = require('express'),
        morgan = require('morgan'),
        compress = require('compression'),
        bodyParser = require('body-parser'),
        methodOverride = require('method-override'),
        config = require('./config'),
        session = require('express-session')
        ;
    
    module.exports = function() {
        var app = express();
    
        if(process.env.NODE_ENV === 'development') {
            app.use(morgan('dev'));
        } else if (process.env.NODE_ENV === 'production') {
            app.use(compress());
        }
    
        app.use(bodyParser.urlencoded({
            extended : true
        }));
        app.use(bodyParser.json());
        app.use(methodOverride());
    
        app.use(session({
            saveUninitialized : true,
            resave : true,
            secret : config.sessionSecret
        }));
    
        app.set('views','./app/views');
        app.set('view engine', 'ejs');
    
        require('../app/routes/index.server.routes.js')(app);
        require('../app/routes/users.server.routes.js')(app);  // 라우팅 추가
        app.use(express.static('./static'));
    
        return app;
    }
    


    추가 한 것은 위에서 만든 라우팅 파일을 추가 하였다.

    자 이젠 테스트를 해보자. 

    먼저 cmd 에서 mongod 를 명령어로 실행해서 몽고디비를 켜고 StartApp.js 를 실행하자. 

    테스트를 위해서는 아까 mongoose 로 정의해 두었던 속성에 맞게 POST 형식으로 Json 을 보내야 되는데 

    이걸 일일이 주소창에 치고 있을려니 짜증이 날 것이다. 

    그래서 이번기회에 아주 유용한 Application 을 소개하겠다. 구글 크롬 WebStore 에 있는 Postman 이라는 

    application 인데 , web application 을 테스트하기에 아주 좋은 프로그램이다. 

    구글에서 postman 이라고 검색하면 해당 프로그램이 나오므로 바로 받아서 설치를 하자. 


    postman 을 설치하고 실행하면 아래와 같은 화면이 나온다. (sign in 을 하라는 문구는 skip 을 하자.)


    보기만 해도 사용법을 알 것 이다. 

    먼저 GET 부분을 POST로 바꾸고 주소창에 라우팅파일에 정의했던 http://localhost:3000/users 로 적은 뒤 

    body 탭으로 가서 raw 로 바꾼 뒤 json으로 설정을 하고 본문을 적자. 


    {

        "username" : "firstUser"

      , "userid" : "firstid"

      , "password" : "password1"

      , "email" : "email@email.com"

    }


    최종적으로 아래 그림과 같이 되어야 한다. 


    자 이젠 Send 를 실행하자.

    제대로 전송이 되고 저장이 되었다면 아래 그림과 같이 응답이 와야 한다.



    이제 mongoDB 로 가서 제대로 저장이 되었는지 확인해보자. 

    새로운 cmd 창을 열고 mongo database 를 실행하여 database db 로 접속을 한다. 

    이제 show collections 를 실행해보면 users 라는 collection 이 생긴 것이 보일 것이다. 

    db.users.find() 로 users 에 있는 데이터를 보자 . 위에서 입력했던 데이터가 들어있는 것 을 볼 수 있을 것이다.



    유저를 생성하는 것을 만들었으니 이번에 find() 메소드를 구현해보자.

    app/controllers/ 폴더의 users.server.controller.js 파일로 가서 위에 만들었던 create 메소드 밑에 

    list 메소드를 추가하자. 


    exports.list = function(req,res,next) {
    
        User.find(function(err,users) {
            if(err) {
                return next(err);
            }else{
                res.json(users)
            }
        })
    }
    


    find 명령어를 사용하고 콜백함수에 인자로 users 라는 collection 이름을 넣어서 에러가 없을 경우 users 컬렉션의

    find 명령어에 대한 데이터를 응답할 것 이다. 

    이제 라우팅을 추가 해야 하니 app/routes 폴더로 가서 users.server.controller.js 파일을 수정하자. 


    var users = require('../../app/controllers/users.server.controller');
    
    module.exports = function(app) {
        app.route('/users')
        .post(users.create)
        .get(users.list);
    };
    


    기존 post create 밑에 get(users.list) 를 추가 하였다. 

    이제 서버를 재시작하고  postman으로 가서 get 방식으로 http://localhost:3000/users 로 send 해보자. 



    위 그림과 같이 현재 users 에 있는 데이터들이 응답할 것 이다. 


    이제 어느정도 mongodb를 활용하기 시작했다. 다음 장에는 단일 사용자를 찾는 findOne() 메소드와 

    유저의 정보를 갱신하는 update , 그리고 delete 작업을 추가하고 mongoose 스키마에 옵션을 주는 

    방법을 알아 볼 것이다. 


    HTTP Verbs 

    GET - get a resource 

    POST - create a resource 

    PATCH - update a resource

    PUT - replace a resource

    DELETE - Delete a resource


    (끝) 

    현재 까지 폴더 구조)


    댓글