ABOUT ME

-

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



    10장에 이어서 mongoose 를 이용한 CRUD 작업을 이어가겠다. 


    이번엔 모든 사용자가 아닌 findOne()  단일 사용자를 찾는 메소드를 만들겠다. 


    먼저 app/controllers 폴더로 가서 users.server.controller.js 파일의 끝에 다음 코드를 수정하자. 



    exports.read = function(req,res) {
        res.json(req.user);
    };
    
    exports.userByID = function(req,res,next,id) {
        User.findOne({
            _id : id
        }, function(err, user) {
            if(err) {
                return next(err);
            }else{
                req.user = user;
                next();
            }
        })
    }
    


    findOne 을 할 때는 부분 집합의 첫 다큐먼트만 인출한다. 


     userByID 메소드에서 findOne() 으로 원하는 하나의 데이터를 가져온 뒤 req.user 에 반영하고 next() 메소드를 


    사용한다. 당연히 next 가 호출하는 다음 메소드는 read() 메소드가 될 것이다.  


    순서를 보자면  _id 에 찾고자 하는 아이디를 넣고 전송하면 그 아이디에 해당하는 데이터를  찾아서 req.user 에 


    넣고 read 메소드를 실행하여 json 으로 해당 데이터를 응답한다. 


    그리고 특정 유저를 갱신 , 삭제를 할 때도 해당 userByID 메소드는 유용하게 사용될 것 이다. 


    이제 다음 순서는 무엇일까?  당연히 라우팅을 추가하여야 한다.  app/routes 폴더로 가서 users.server.routes.js 


    파일을 수정하자. 



     
    var users = require('../../app/controllers/users.server.controller');
    
    module.exports = function(app) {
        app.route('/users')
        .post(users.create)
        .get(users.list);
    
        // 추가 부분 
        app.route('/users/:userId')
        .get(users.read);
    
        app.param('userId', users.userByID);
    
        // 추가 끝 
    };
    
    


    코드를 보자. express 에서는 라우팅 정의에 포함된 부분 문자열 앞에 콜론을 추가하면 매개변수로 취급한다. 


    이 매개변수를 다른 라우팅 미들웨어를 수행하기 전에 먼저 app.param 메소드로 userId 를 이용하여 userByID 


    메소드를 먼저 수행한다.  그런 뒤 users.read 가 실행 될 것 이다. 


    이제 설정 했으니 테스트를 해보자. 저번 10장에서 유용하게 사용한 postman 을 사용하여 테스트를 해보자.


    몽고디비를 키고 , 노드서버를 시작하자. 그리고 mongodb 에 저장된 데이터 중 _id 값을 하나 얻어오자. 


    10장에서 잘 따라 했다면 postman 으로 get 방식으로 http://localhost:3000/users/ 주소로 요청을 보내면 


    저장되어있는 데이터가 나올 것 이다. 




    위 그림처럼 저장되어있는 데이터가 나오면 _id 항목을 복사하여 다시 get 방식으로 


    http://localhost:3000/users/_id값  으로 실행해보자. 







    해당 아이디가 응답으로 돌아 온 것이 보이는가?  이렇게 단일 유저를 검색하는 기능을 추가하였다. 


    이번에는 해당 유저의 update , 즉 갱신을 하는 메소드를 추가해보자. 


    몽구스 모델은 기존 데이터를 갱신하기 위한 여러 메소드를 제공한다.  update() , findOneAndUpdate() , 


    findByIdAndUpdate() 가 있다. 


    이 중 여기서는 이미 UserByID 메소드를 사용했기 때문에  findByIdAndUpdate() 메소드를 사용하자. 


    app/controllers 폴더로 가서 users.server.controller.js 파일의 끝 부분에 update() 메소드를 추가하자. 



    exports.update = function(req,res,next) {
        User.findByIdAndUpdate(req.user.id, req.body, function(err, user) {
            if(err) {
                return next(err);
            }else{
                res.json(user);
            }
        });
    };
    


    이젠 코드를 딱 보면 어떤 식으로 작동하는지 바로 보일 것 이다. 


    findByIdAndUpdate 메소드의 인수로 갱신 할 user.id 와 변경할 내용이 담긴 req.body 를 받는 것을 보자. 


    이 다음엔 뭘 해야 하는지 알 것 이다. 라우팅을 추가하자. 


    app/routes 폴더로 가서 users.server.routes.js 파일의 코드를 수정하자. 




    var users = require('../../app/controllers/users.server.controller');
    
    module.exports = function(app) {
        app.route('/users')
        .post(users.create)
        .get(users.list);
    
    
        app.route('/users/:userId')
        .get(users.read)
        .put(users.update);  // 추가 부분 
    
        app.param('userId', users.userByID);
    };
    
    


    이제 update 도 테스트 해보자.  수정한 파일들을 저장하고 서버를 다시 시작하자. 


    이번엔 put 방식으로 http://localhost:3000/_id  와 함께 변경할 내용이 담신 json 을 보내자.




    본인은 username 을 firstname 에서 lastname 으로 바꾸기로 하고 위 그림과 같이 요청을 보냈다. 




    Update 후에 조회를 했더니 username 이 바뀐 것 을 확인 할 수 있다. 


    이제 마지막으로 삭제 메소드를 추가해보자. 


    mongoose 는 갱신 메소드와 마찬가지로 삭제에도 remove() , findOneAndRemove(), findByIdAndRemove() 


    메소드를 제공한다.  여기서 무엇을 사용해야 할까? 삭제는 _id 값 하나로 그냥 묻지도 따지지도 않고 삭제하기


    때문에 remove() 메소드를 사용할 것 이다. 


    app/controllers 폴더로 가서 users.server.controller.js 파일의 코드 마지막에 delete() 메소드를 추가하자. 



    exports.delete = function(req,res,next) {
        req.user.remove(function(err) {
            if(err) {
                return next(err);
            }else{
                res.json(req.user);
            }
        })
    };
    



    이제 바로 라우팅을 추가하자. 


    app/routes 폴더로가서  users.server.routes.js 파일을 변경하자. 


    var users = require('../../app/controllers/users.server.controller');
    
    module.exports = function(app) {
        app.route('/users')
        .post(users.create)
        .get(users.list);
    
    
        app.route('/users/:userId')
        .get(users.read)
        .put(users.update)
        .delete(users.delete);  // 추가 부분
    
        app.param('userId', users.userByID);
    
    };
    
    



    이제 delete 역시 테스트 해보자. 서버를 다시 시작하고 delete 방식으로 http://localhost:3000/users/_id 값으로 


    요청을 하자. 






    삭제 후 조회를 해보면 데이터가 삭제 된 것을 확인할 수 있다. 



    10장에이어 이번 장 까지 해서 mongoose 를 활용한 CRUD 작업을 완성하였다.  


    다음 장에는 몽구스 스키마 의 다양한 확장과 모델링 변경을 살펴보고 데이터의 CRUD 작업을 검증하는 방법을


    알아보자. 



    (끝)






    (폴더구조 )

    댓글