본문 바로가기
개발관련

rest API 무식하게 따라하기(node&express, mongodb 활용 구현)

by 딸기별땅 2021. 11. 13.

신입적에 손댔던 db는 sql 쿼리를 하나하나 짜서 날렸는데요

node에서 js문법으로 express 프레임워크에 내장된
get/post/put/delete에 파라미터를 태워보내면

알아서 select, insert, update, delete를 수행해줍니다. 

 

참고로 이 본문에서 vue 프로젝트 생성이라던가,

express, db설치, postman을 이용한 api테스트는 생략하고

딱 구현만 정리 하도록 하겠습니다.. 왜냐면 내 메모 용도이므로.. -ㅅ-;

1. 폴더구조

기본 패키지 세팅에서 추가될 파일들은

서버를 실행시키기 위한 src/server.js

db에 접속하기 위한 src/config.js

스키마 모델 정의를 위한 src/models/user.js

실제 api구현을 위한 src/routes/index.js 이렇게 4개만 만들어 건드릴거고요

 

가능하면 에러처리같이 현재 소스코드 이해에 방해되는것들은 모두 제거했습니다. 

 

 

src/server.js

const express = require('express');
const app = express();
const port = process.env.PORT || 4000;
const db = require('./config.js');//db정보
const User = require("./models/user");//user모델 사용 
const router = require('./routes')(app, User) //app,User 변수를 router로 내보냄

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static('src'));//src 접근허용

app.listen(port, () => console.log(port + '번 포트'));

서버를 세팅해주는데 현재는 파일이 없으므로

에러가 난다면 const db, User, router를 잠시 주석처리 시키세요.

당연히 이 소스에 앞서서 express를 설치는 해 주어야 express가 동작 하겠죠?;;

 

그다음에 터미널에서 프로젝트 폴더로 이동하셔서 server.js를 실행시킵니다.

node src/server.js

콘솔로그에 ~번 포트라고 나오겠죠?

사실 이렇게 실행하면 소스코드 고치고나서 서버를 계속 껐다가 다시 켜줘야하는데요

귀찮으시면 nodemon이라는걸 install해서 nodemon src/server.js 로 실행시키면 됩니다.

필요하다면 노드몬 검색 ㄲ

 

 

src/config.js

const mongoose = require("mongoose");

const database = mongoose.connection;
database.on('error', console.error);
database.once('open', function(){
    console.log("connected db server");
}); 
mongoose.connect('mongodb://username:password@localhost:27017', { dbName: 'dbname'}, function(err){
    if(err) {
        console.log(err + '에러');
    }
});

디비를 연결하는 config파일

디비마다 다를 수 있으므로 따로 찾아봐야 함

mongoDB는 27017 포트가 기본.

특정 node버전에서 mongo가 버전에러를 계속 토했는데

저는 mvn을 설치해서 node버전을 변경했더니 잘 동작합니다. 

 

src/model/user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new mongoose.Schema({
    user_id: String,
    pw: String
});

// 모델 생성
const User = mongoose.model("User", UserSchema);
module.exports = User;

디비 구조에 맞추어서 스키마 모델을 만들두고

User라는 이름으로 다른곳에서 불러 쓸 수 있도록 export

 

 

src/routes/index.js

module.exports = function(app, User) { //server.js 변수사용
    app.get('/', (req, res) => {
        res.send('hello node');
    })

    //GET ALL USER
    app.get('/api/users', function(req,res){
        User.find(function(err, users){
            res.json(users);
        })
    });

    //GET USERID
    app.get('/api/users/:userid', function(req, res){
        //필드명:요청된 파라메터
        User.findOne({user_id: req.params.userid}, function(err, result){
            // if(!pw) return res.status(404).json({error: 'pw not found'});
            res.json(result);
        })
    });

    //INSERT
    app.post('/api/users', (req, res) => {
        //User모델, 새 행에 추가할 값
        const userData = new User({
            user_id: "user15",
            pw: "user17"
        });
        console.log(req, res);
        userData.save();
    })

    //UPDATE THE USER
    app.put('/api/users/:userid', function(req, res){
        //user_id필드가 userid파라메터와 일치하는것 1개 조회
        User.findOne({user_id: req.params.userid}, (err, result) =>{
            //반환된 result배열의 user_id값을 변경
              result.user_id = "test_update";
              result.save()//저장
              res.json(result);//결과 배열
        })
    });

    //DELETE USER
    app.delete('/api/users/:userid', function(req, res){
        console.log(req.params.userid + "가 삭제됨");
    });

}

요것이 오늘의 핵심 소스 코드. 사실 다른 세팅 다 되있으면 이것만 보면 됩니다. 

크게 자바스크립트 배열 관련 내장함수인 find를 이용한 단순 조회 get과

find조회후 save함수를 쓰는 post, put

파라메터(:userid)만 넣어서 삭제하는 delete로 나누어집니다. 

 

테스트는 postman을 다운받아서 사용하거나

크롬 확장프로그램중 insomnia라는 프로그램이 있다고 하니

http://localhost:4000(server.js에서 설정한 포트번호)/api/users 또는

http://localhost:4000(server.js에서 설정한 포트번호)/api/users/user22 처럼 파라메터를 넣어서

결과를 확인해볼수 있습니다. 

댓글