-
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 작업을 검증하는 방법을
알아보자.
(끝)
(폴더구조 )
'MeanStack (deprecated)' 카테고리의 다른 글
13장 mongoose(몽구스)를 이용한 index 활용, 데이터 검증 (5) 2016.06.21 12장 mongoose(몽구스) 를 이용한 스키마 확장 (1) 2016.06.19 10장 mongoose (몽구스) 를 이용한 MongoDB 스키마 생성, CRUD 작업 (1) (4) 2016.06.16 9장 mongoose (몽구스) 를 이용한 Mongodb 연결 (4) 2016.06.14 8장 MeanStack 의 또 다른 조각 MongoDB 를 알아보자 (0) 2016.06.13