본문 바로가기

Nodejs

[Nodejs]웹 어플리케이션 다이어리 + postman 사용

cmd1 : DB 연결을 해준 상태에서

cmd2 : heroku login

heroku local web으로 저장된 데이터 확인해줍니다.

라우팅: 어떤 식으로 요청하는지 경로, 행동을 설정해 중계해주는 역할

라우팅을 통해 한 곳에 소스가 너무 많아지면 복잡해지고 관리가 힘들어지므로, 하나의 소스코드를 각 목적에 맞게 나누는 과정, CRUD를 사용하기 위해 REST API용 로직으로 정리.

 

model 폴더와 routes 폴더에 각각 diary.js 파일을 라우팅해줌

model에는 db관련 파일을 분리해주며, 분리해준 뒤에는 불러오는 과정이 필요합니다.

 

/model/diary.js

호출 대상 코드에서 export, 모듈을 가져다 쓸 때 필요한 정보를 주는 코드, 보내고자 하는 것을 적어줍니다.

 

routes에서는 model을 참조해 CRUD 기능 입력해줄 것, api를 만들어줌

아래처럼 호출한 곳에 라우터를 전달해줌

1
2
3
4
5
var router = express.Router();
.
.
.
module.exports = router;

 

/routes/diary.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//모델 가져오기
var express = require('express');
 
var data = require('../model/diary');                       //다이어리 모델 스키마를 가져온다 : 상대경로
 
 
var bodyParser = require('body-parser');                    //body의 json을 파싱해주는 모듈
 
var dateFormat = require('dateformat');                     //날짜형식을 원하는 형태로 바꿔주는 모듈
var empty = require('is-empty');                            //빈값 체크 모듈 *.주의:0도 empty로 판단함
const stringify = require("json-stringify-pretty-compact"); //json 값을 문자열로 (보기좋게)변환해주는 모듈
 
var router = express.Router();
 
router.use(bodyParser.urlencoded({ extended: false }));
 
 
//전체 데이터를 불러와서 항목별로 보기 : 실제 호출주소 http://~~/api/diary/
router.get('/'function (req, res) {
 
    data.find(function(error, diary){
 
        var resultData = "";
 
        //에러가 없고, 결과값이 있다면
        if(!error && !empty(diary)){
            resultData = diary;
            // resultData = stringify(diary);
        }
 
        res.json(
            {
                result: empty(error), error:error, data:resultData
            }
            );
    });
 
});
 
//id 기반으로 조회하여 데이터를 1건 불러오기 : 실제 호출주소 http://~~/api/diary/id값
router.get('/:id'function (req, res) {
 
    data.findOne({_id:req.params.id}, function(error, diary){
 
        var resultData = "";
        if(!error && !empty(diary)){
            resultData = diary;
        }
 
        res.json({result: empty(error), error:error, data:resultData});
    });
});
 
//데이터를 추가하기 : 실제 호출주소 http://~~/api/diary/ + body데이터
router.post('/'function (req, res) {
 
    var title = req.body.title;
    var content = req.body.content;
 
    if(!empty(title) && !empty(content)) {
        var diaryData = new data();
        diaryData.title = title;
        diaryData.content = content;
        var now = new Date();
        diaryData.date = dateFormat(now, "yyyymmdd");
        diaryData.imgList = "";
 
        //콘솔창을 통해서 로그를 확인해볼 수 있다
        console.log("diary content diaryData::" + diaryData);
 
        diaryData.save(function(error, resultData){
            res.json({result: empty(error), error:error, data:resultData});
        });
    }
    else {
        res.json({result: false, error:null, data:null});
    }
 
});
 
//id로 데이터를 찾아서 수정 : 실제 호출주소 http://주소/api/diary/ + body데이터
router.put('/:id'function (req, res) {
 
    var title = req.body.title;
    var content = req.body.content;
    const id = req.params.id;
 
    if(!empty(id)) {
 
        data.findOneAndUpdate({_id: id}, {$set:
                { title: title, contentcontent }
        }, {returnNewDocument: true}, (error, doc) => {
            res.json({result: !error, error:error});
        });
    }
    else {
        res.json({result: false, error:null, data:null});
    }
 
});
 
//id로 찾아서 삭제 : 실제 호출주소 http://~~/api/diary/id값
router.delete('/:id'function (req, res) {
    const id = req.params.id;
    if(!empty(id)) {
        data.remove({_id: id}, function(error, resultData){
            res.json({result: empty(error), error:error, data:resultData});
        });
    }
    else {
        res.json({result: false, error:null, data:null});
    }
});
 
module.exports = router;
 

 

routes 호출하기

라우터 파일만 가져오고, 사용할 api를 호출 경로를 추가해주면 api/diary를 자동으로 잡아줌

index.js

1
2
const router = require("./routes/diary"); //라우터 모듈 등록
 
app.use('/api/diary', router) //추가해주기
 
itional information>

 

웹 화면

웹으로 확인하면 아래처럼 다이어리에 저장된 데이터를 확인할 수 있습니다.

Postman으로 확인

heroku local web으로 웹을 켜야함

라우터에서 get, post, put, delete의 기능을 확인 

1. get  결과

get으로 저장된 데이터 json 형태로 가져옴

2. post 실행

Header의 x-www-form-urlenconded를 선택 후 key값을 선택해 내용을 넣어줄 수 있음

3. put 실행

수정을 원할 때, url에 id값을 넣고, post 방식과 동일하게 진행

수정 후 데이터 조회

 

4. delete 실행

url에 id값을 입력하면 해당 데이터가 삭제됩니다.

삭제 후 확인

 

Rest API

www 웹에서 api 통신을 할때의 규약으로 좀 더 명확하게 구분이 가능하도록 만들어 추후 범용성과 확장성에 유용하게 하려는 구조가 API.

 

MongoDB Schema

RDBMS의 Schema는 데이터베이스를 구성하는 레코드의 크기, 키(key)의 정의, 레코드와 레코드의 관계, 검색 방법 등을 정의한 것이다.

Mongoose의 Schema는 MongoDB에 저장되는 document의 Data 구조 즉 필드 타입에 관한 정보를 JSON 형태로 정의한 것으로 RDBMS의 테이블 정의와 유사한 개념이다.

MongoDB는 Schema-less하다. 이는 RDMS처럼 고정 Schema가 존재하지 않는다는 뜻으로 같은 Collection 내에 있더라도 document level의 다른 Schema를 가질 수 있다는 의미이다.

이는 자유도가 높아서 유연한 사용이 가능하다는 장점이 있지만 명시적인 구조가 없기 때문에 어떤 필드가 어떤 데이터 타입인지 알기 어려운 단점이 있다. 이러한 문제를 보완하기 위해서 Mongoose는 Schema를 사용한다.

 

스키마 개념 참고) https://poiemaweb.com/mongoose

 

Node.js(express)와 MongoDB 연동 RESTful API - Mongoose | PoiemaWeb

Mongoose는 Node.js와 MongoDB를 위한 ODM(Object Data Mapping) library이다. Java 기반의 Hibernate. iBatis 등의 ORM(Object Relational Mapping)과 유사한 개념이다. ODM의 사용은 코드 구성이나 개발 편의성 측면에서 장점이 많다. 호환성이 없는 프로그래밍언어(JavaScript) Object와 MongoDB의 데이터를 Mapping하여 간편한 CRUD를 가능하게 한다. 필

poiemaweb.com

 

이어서 heroku 배포를 해줬습니다.