서버는 클라이언트로부터 특정 페이지를 보여달라는 요청이(GET) 발생하는 경우 해당 페이지와 함께 전달되어야할 데이터를 전달해야 한다.

 

예를 들어, 마이 페이지를 보여주어야 할 때, 페이지 구성을 담당하는 데이터 (HTML, CSS ,JS) 뿐만 아니라,

 

로그인한 사용자의 데이터를 전달 해주어야 한다. 이런 데이터들을 저장, 출력, 수정, 삭제를 위해 웹 서버와 DB를 연결한다.

 

DB는 다양한 제품이 있으나, 여기에서는 mongo db를 이용하여 연결할 것이고,

 

node js 라이브러리 중 mongodb와 통신이 가능한 라이브러리인 mongoose 를 사용한다.

 

// 위치 : 프로젝트 폴더/schemas/index.js

const mongoose = require("mongoose");

// mongodb 연결
const connect = () => {
    mongoose
        .connect("mongodb://localhost:27017/spa_mall")
        .catch(err => console.log(err));
}

// 에러 발생 시 출력
mongoose.connection.on("error", err => {
    console.error("DB 연결 에러", err);
});

module.exports = connect;

먼저, DB 연결을 위해 mongoose 라이브러리를 설치한다 (npm install mongoose)

 

그 후, 프로젝트 폴더에 schemas 폴더를 생성, index.js 파일에 위와 같이 입력한다.

 

폴더 이름은 자유롭게 해도 무방하지만, 연결과 관련된 코드가 있는 파일은 반드시 index.js 로 명명 해주어야 한다. 

 

연결 코드 작성이 끝났다면, 이제는 데이터가 적재될 곳의 필드별 유형과 필수 여부를 확인할 수 있는 코드를 작성해야 한다.

 

// 파일 위치 : 프로젝트폴더/schemas/goods.js

const mongoose = require("mongoose");

// 테이블 (데이터셋) 정의
const goodsSchema = new mongoose.Schema({
    goodsId: {
        type: Number,
        required: true,
        unique: true
    },
    name: {
        type: String,
        required: true,
        unique: true
    },
    thumbnailUrl: {
        type: String
    },
    category: {
        type: String
    },
    price: {
        type: Number
    }
});

// 모률로 사용
module.exports = mongoose.model("Goods", goodsSchema);

위의 코드는 index.js 파일과 같은 위치에 데이터셋 - goods를 정의하는 내용이다.

 

각 키는 필드 이름을 의미하며, type 은 필드의 유형, unique 는 필드 내 유일한 값이어야 하는지에 대한 확인

 

마지막으로 required는 데이터 저장 시 필수 포함 여부를 정하는 내용이다. 데이터 저장 시 필드별 조건을 하나라도 만족하지 못 한다면 오류가 난다.

 

추가적으로 위 코드에서는 goodsId를 통해 Id를 별도로 생성하고 있지만, 데이터별 id는 설정해주지 않아도 자동으로 생성된다.

 

마지막으로, 위 코드들을 외부에서도 사용할 수 있도록  module.exports 를 해준다.

 

// 파일 위치 : 프로젝트폴더/routes/goods.js

const express = require('express');
const router = express.Router();
const Goods = require("../schemas/goods.js");

// 상품 등록 API
router.post('/goods', async(req, res) => {
    const { goodsId, name, thumbnailUrl, category, price } = req.body;
    const goods = await Goods.find({ goodsId });

    if (goods.length) {
        return res.status(400).json({ success: false, errorMessage: "이미 있는 데이터입니다." });
    }

    const createdGoods = await Goods.create({ goodsId, name, thumbnailUrl, category, price });
    res.json({ goods: createdGoods });
})

module.exports = router;

여기서는 폴더 위치와 파일 이름이 조금 다르지만, 서버 작동 파일에서 직접 구현해줘도 문제는 없다.

 

위 코드는 먼저, goods.js 파일을 불러온다 (데이터 유형 정의)

 

그 후 특정 url로 post 요청이 들어오면, body에 있는 데이터 (goosId 등)를 변수에 저장한 후, goodsId를 가진 필드가 있는지 검사,

 

있다면 에러 메세지를 반환하고, 그렇지 않다면 데이터를 저장한다.

 

위의 코드에서는 unique가 보장되어야하는 다른 필드 (name)에 대한 검사 및 데이터 유형에 대한 검사는 진해하지 않고 있어서

 

에러가 발생하기 쉽고, 발생 원인 확인이 어려운 코드이므로, 실제로 사용하게 된다면

 

각 데이터에 대한 적합성 검사 (혹은 입력 때 부터 데이터 유형 제한) 를 위한 추가 코드가 필요하다. (ex. try & catch)