본문 바로가기

과거공부모음

나의 개발일지 TIL(Today I learned) - 라우팅, 모듈, 리퀘스트, 리스폰스, 몽고디비

Today I learned

  • 라우팅
  • 모듈
  • 리퀘스트, 리스폰스
  • 몽고디비

라우팅

라우팅(routing)이란? 클라이언트의 요청 조건(메서드, 주소 등)에 대응해 응답하는 방식

express.js는 기본 기능으로 라우팅을 하게 해주는 Router을 지원한다

일반적인 Router의 기본 구조

router.METHOD(PATH, HANDLER);
  • router: express의 라우터를 정의하기 위해 사용
  • METHOD: HTTP METHOD를 나타낸다 (get, post, put, deledte)
  • PATH: 실제 서버에서 API를 사용하기 위한 경로
  • HANDLER: 라우트가 일치할 때 실행되는 함수

라우트를 사용하는 방식은 routes폴더를 만들고 api파일을 만들어 넣는다 해당 파일에 라우팅 기능을 하는 Router함수를 사용해 Router를 생성한다 그리고 엔드포인트를 작성한다

app.js에서 사용해야 하기 때문에 내보내 준다

// routes/goods.js

const express = require('express');
const router = express.Router();

// localhost:3000/api/ GET
router.get("/", (req, res) => {
  res.send("default url for goods.js GET Method");
});

// localhost:3000/api/about GET
router.get("/about", (req, res) => {
  res.send("goods.js about PATH");
});

module.exports = router;

app.js에서 Router 미들웨이를 사용하겠다고 만든다 /api로 시작되는 주소는 routes폴더 안에 goods.js에 있는 Router미들웨이를 통해 처리한다

// app.js

const goodsRouter = require("./routes/goods");

// localhost:3000/api -> goodsRouter
app.use("/api", [goodsRouter]);

🤔미들웨어는 뭘까?

웹 서버에서 요청을 받을 때 가끔 모든 요청에 대해 공통적인 처리를 하고 싶은 경우가 생길 수 있다 이럴 때 미들웨어를 이용하여 웹 서버의 요청/응답에 대해 공통적으로 관리가 가능하다고 가볍게 알고 넘어가자

나중에 확실하게 알아보자!!

모듈

모듈(Module)이란 Javascript 파일 단위로 분리된 코드를 말한다

여기서 Javascipt 파일은 특정한 기능을 가진 여러 개의 함수와 변수들의 집합이다

  1. 모듈은 하나의 모듈에서 다른 모듈을 호출하여 사용할 수 있다
  2. 모듈은 그 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로 사용 가능하다
  3. 보통 1개의 파일이 1개의 모듈이 된다

🤔모듈을 왜 사용하는 거지?

  1. 코드 베이스를 분리할 수 있고 이를 통해서 코드를 구조적으로 관리할 수 있다
  2. 코드를 재사용 가능하게 만들어준다 모듈화(modularize)
  3. 모듈의 인터페이스만 노출시킬 수 있다 인터페이스 이외 모든 정보를 은닉하는 정보은닉을 구현할 수 있다
  4. 종속성을 관리할 수 있다

모듈을 사용하는 방법은 CommonJS방법과 ES6방법이 있다

가져오는 방법의 차이

/* CommonJS  */
const name = require('./module.js');

/* ES6 */
import name from './module.js'

내보내는 방법의 차이

/* CommonJS  */
const name = '고양이';

module.exports = name;

/* ES6 */
const name = '고양이';

export default name;

리퀘스트, 리스폰스

리퀘스트(request), 리스폰스(response)

  • 리퀘스트(request)는 클라이언트가 서버에게 전달하는 정보나 메시지가 담긴 객체
  • 리스폰스(response)는 서버에서 클라이언트에게 응답 정보나 메시지를 전송시켜주는 객체

express.js의 req, res

req객체

  • req.body: 리퀘스트(request)를 호출할 때 body로 전달된 정보가 담긴 객체 express.json() 미들웨어를 이용해야 해당 객체를 사용할 수 있다
  • req.params: 라우터 매개 변수에 대한 정보가 담긴 객체
  • req.query: 리퀘스트(request)를 호출할 때 쿼리 스트링으로 전달된 정보가 담긴 객체
  • req.cookies: 리퀘스트(request)를 호출할 때 Cookie 정보가 담긴 객체 cookie-parser 미들웨어를 이용해야 해당 객체를 사용할 수 있다

res객체

  • res.status(코드): 리스폰스(response)에 http 상태 코드를 지정 가능하다 https://developer.mozilla.org/ko/docs/Web/HTTP/Status 여기서 찾아서 사용하자
  • res.send(데이터): 데이터를 포함하여 리스폰스(response)를 전달한다
  • res.json(JSON): JSON형식으로 리스폰스(response)를 전달한다

객체들이 더 있지만 자주 사용하는 거 먼저 알아두자!!😏

몽고디비

node.js로 만들고 있는 나의 코드에서 MongoDB를 사용하려면 어떻게 해야 할까?

python으로 MongoDB를 사용할 때 pymongo를 사용했던 것처럼 node.js에서는

mongoose라는 도구를 사용해서 사용할 수 있다

  1. mongoose 문서(Document)는 각 데이터 하나하나 1개 이상의 key-value를 말한다
  2. mongoose 컬렉션(Collection)은 JSON형식의 여러 가지 문서(Document)를 보유할 수 있다 관계형 데이터베이스(MySQL)의 Table과 동일하다
  3. mongoose 스키마(Schema)는 컬렉션(Collection)에 들어가는 문서(Document)에 어떤 종류의 값이 들어가는지 정의한다 데이터 모델링할 때 사용한다
  4. mongoose 모델(Model)은 데이터베이스에 데이터를 저장해 줄 때 데이터의 구조를 담당한다 스키마(Schema)를 사용하여 만들고 MongoDB에서 실제 작업을 처리할 수 있는 함수들을 지니고 있다 문서(Document)를 생성할 때 사용한다

mongoose를 사용해보자

schemas폴더를 만들고 서버와 mongoDB를 연결시켜주는 파일을 만든다

// schemas/index.js

const mongoose = require("mongoose");

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;

내보낸 connect를 이용해서 데이터베이스를 연결한다

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

schemas폴더를 만들고 collection마다 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);

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

오늘 발생한 경고 에러

Deprecation Warning “the strictQuery” 이 경고 에러가 지속적으로 발생했다 하지만 데이터베이스가 연결이 안 되는 건 아니었다 하지만 콘솔 창에 계속 경고 에러 메시지가 발생해서 해결해야 했다 이 경고 메시지가 발생하는 이유는 mongoose 7에서 기본적으로 strictQuery가 false로 전환되어 있다고 한다 그래서 대비를 하거나 true로 전환해야 한다는 메시지라고 한다 mongoose.set('strictQuery', true);를 이용해서 strictQuery를 true로 전환해 해결했다

// schemas/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;