MongoDB Client: Studio 3T 사용하기

이정기·2022년 12월 15일
0

TIL

목록 보기
43/71
post-thumbnail

Studio 3T란?

Studio 3T의 GUI를 통해 MongoDB에 저장된 데이터를 관리

local 에 MongoDB 연결

1.수동으로 연결 선택
2.New Connection 버튼 클릭

  • db 이름 입력
  • localhost : 27017 (기본)
  1. 만든 connection 을 클릭 후 Connect 버튼눌러 연결

데이터 제어해보기.

데이터 넣기

db.mongodb_prac.insertOne({ key: "value", key2: "값" })
ObjectIdkeykey 2
639a9b...value

데이터 확인

db.mongodb_prac.find({})

데이터 삭제

보여진 데이터에서 오른쪽 클릭 -> Document → View Document
ObjectId 추출

db.mongodb_prac.deleteOne({ _id: ObjectId(db.mongodb_prac.deleteOne({ _id: ObjectId("...")}))})

내 코드에서 MongoDB 이용

mongoose 설치

코드에서 DB Client 역할

npm install mongoose

mongoose의 문서(Document)란?

MongoDB에서 가지고 있는 각 데이터 하나하나를 문서(Document)라고 정의

mongoose 형태

{
    "_id": ObjectId("6682192a1c155bd2f27881"),
    "name": "lyw",
}

mongoose의 컬렉션(Collection)이란?

  • JSON 형식의 여러가지 문서(Document)를 보유
  • 관계형 데이터베이스(RDB)의 Table과 동일한 역할

mongoose의 스키마(Schema)란?

  • 컬렉션(Collection)에 들어가는 문서(Document)에 어떤 종류의 값이 들어가는지를 정의
  • 데이터를 모델링할 때 사용

스키마 타입

  • null : null 값과 존재하지 않는 필드
    • ex: null
  • String : 문자열
    • ex: “mongoDB”
  • Number : 숫자
    • ex: 3.14
  • Date : 날짜
    • ex: new Date()
  • Buffer : 파일을 담을 수 있는 버퍼, UTF-8이 아닌 문자열을 저장
    • ex: 0x65
  • Boolean : true or false
    • ex: true
  • ObjectId(Schema.Types.ObjectId) : 객체 ID, 주로 다른 객체를 참조할 때 넣음
    • ex: ObjectId()
  • Array : 배열 형태의 값
    • ex: ["a", "b", "c"]

mongoose의 모델(Model)이란?

  • 데이터베이스에 데이터를 저장해줄때 데이터의 구조를 담당
  • 스키마를 사용하여 만들고, MongoDB에서 실제 작업을 처리할 수 있는 함수를 가지고 있음
  • 문서(Document)를 생성할 때 사용

웹 서버에서 MongoDB에 연결

Directory Structure 예시

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

index.js 코드

const mongoose = require("mongoose");
mongoose.set('strictQuery', true);

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

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

module.exports = connect;

mongoose.set('strictQuery', true);
-> Mongoose Deprecation Warning "the strictQuery" 대응

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);

각 요소마다 데이터 특성을 정의한다.

app.js 추가코드

const goodsRouter = require('./routes/goods.js'); //goods.js 를 가져온다.
const connect = require("./schemas");
connect();

//전역 미들웨어에 적용하겠다.
app.use(express.json());

// api 경로가 추가 된 경우 모두 goodsRouter 로 통해서 간다.
app.use("/api", goodsRouter)     

require 로 schemas 의 있는 폴더를 모두 읽고
connect(); 함수로 바로 실행시킨다.

json()으로 정의된 전역 미들웨어는 /api 보다 위에 있어야한다.

router - goods.js

  //데이터베이스 가져오기 때문에 동기로 실행
  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(200).json({
            success:false,
            errorMessage:"이미  존재하는 GoodsId 입니다."
        });
    }

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

데이터를 넣었을 때, 중복처리

Thunder Client 로 POST 확인

POST 로 설정 후 body 에 데이터 입력했을 때,

{
   "goodsId": 2,
   "name": "시원한 콜라",
   "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRk7JqMw7ZYZP4ZW136wcoMTmLzbrMIJzUWb1Dhu9cHwCPp0gA&usqp=CAc",
   "category": "drink",
   "price": 3000
}

결과값

{
  "success": false,
  "errorMessage": "이미  존재하는 GoodsId 입니다."
}

내가 넣었던 중복확인 결과값으로 메세지 출력

profile
Node.js 로 꿈을 꾸었다..

0개의 댓글