내용이 너무 난잡하기 때문에 추후에 수정할 예정이다.

 

 

 

원하는 DB를 우클릭, Open Intellishell을 선택

 

 

 

db.Tarel_prac.insertOne({ key: "value", key2: "값" })

 

이와 같은 명령어로 넣어줄 수 있다.

여기서 Tarel_prac은 DB의 이름이다.

 

아래는 데이터 찾기 명령이다.

db.Tarel_prac.insertOne({})

괄호 안이 공란이기 때문에 전체 내용을 찾아오라는 뜻이 된다.

 

지울 때는 지울 대상 우클릭 -> Remove Document를 선택해 지운다.

 

이제 DB에 연결해 보자

 

연결하기에 앞서서 데이터구조는 다음과 같이 생성한다.

├── app.js
├── routes
│   ├── carts.js
│   └── goods.js
└── schemas
    ├── index.js
    ├── cart.js
    └── goods.js

 

아래 코드는 schemas 폴더의 index.js의 내용이다.

const mongoose = require("mongoose");

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

mongoose.connection.on("error", err => {
  console.error("몽고디비 연결 에러", err);
});

module.exports = connect;

차례차례 살펴보자

우선 mongoose를 호출한다.

 

localhost 27017번을 사용하고 Tarel_prac 라는 DB를 사용한다.

 

.catch는 만약 실패했을 때를 위한 것이다.

그 아래 문구도 mongoose 커넥션이 실패했을 때 나타낼 메시지를 뜻한다.

 

다음은 app.js의 내용이다.

const connect = require("./schemas");
connect();

첫줄의 주소만 보면 폴더 이름만 있고 파일명은 없는 것을 볼 수 있다.

Node.js에서는 모듈을 가져올 때 폴더만 정해줘도 되기 때문이다.

require 명령어는 모듈을 가지고 오는 명령어다.

그리고 두번째 줄에서 connect()가 실행되었다.

 

다음은 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);

첫줄은 mongoose 모듈을 가져온다는 내용이다.

 

3번 줄은 mongoose의 Schema를 새롭게 정의 한다는 내용이다.(이름은 goodsSchema다)

 

그 아래로 목록을 살펴보면

goodsId, name, thumbnailUrl 등이 key값이라고 생각하면 된다.

그 key값들의 내용을 보면 다음과 같다.

type: 저장된 데이터의 타입(숫자, 문자열 등등)을 지정해준다.

required: 반드시 존재해야 하는 데이터인가에 대한 여부(ex: 사람에겐 이름이 반드시 필요하지만 학벌은 아닌것 처럼)

unique: 유니크한 값(동일한 데이터는 존재할 수 없다)을 가져야 하는가에 대한 여부

 

이런식으로 인지할 수 있다.

 

최하단에는 mongoose의 모델을 Goods라는 모델로 사용할 것이고

이 Goods라는 모델은 상단에 위치한 goodsSchema를 가지고 와서 정의한다.

이렇게 정의된 값은 module.exports를 통해서 밖으로 내보내 준다.

 

지금까지는 모두 조회하는 API였다.

이번엔 POST하는 메서드를 개발해보자

 

Express.js에서 제공하는 JSON middleware를 사용해 body로 전달된 데이터를 사용할 수 있도록 해보자

app.js에 다음을 추가한다.

app.use(express.json());

이는 middleware로 app.use("/api", [goodsRouter]); 보다 위에 작성되어야 한다.

미들웨어는 순차적으로 거쳐가기 때문이다.

 

이번엔 routes 폴더의 goods.js다.

const Goods = require("../schemas/goods");
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 });
});
하나하나 차례대로 보자면
schemas의 goods 파일을 가져와서 Goods라는 변수에 할당한다.
두번째 줄은 HTTP를 사용하기 위해 router를 쓰고 그 다음 메소드(post)를 작성한다.
/goods라는 URL에 접속했을 때 post를 작동하게 하고
body에 데이터가 있다면 왼쪽의 {}안의 내용물을 가져오라는 뜻이다.

 

5번째 줄은 찾는 명령이다.

goodsId에 해당하는 값이 존재하는지에 대해서 확인하고 데이터 유무와 상관없이 무조건 goods라는 변수에 할당하게 된다.

 

아래의 조건문은 goods.length가 0이 아닐경우 실행한다. (goods는 배열이므로 0이면 값이 없다는 소리)

(참고로 0은 false로도 해석되기 때문에 0이 아니면 조건문을 실행한다.)
(즉, 0이 아니라는 건 이미 존재하는 값이 있다는 뜻이다.)

즉 조건문은 데이터 중복여부를 체크하는 것이다.

 
만약 중복되지 않는다면 조건문 그 아래를 실행하여 데이터를 만든다.
 
 
 
 
 
 
 

 

 

 

+ Recent posts