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개의 파일이 1개의 모듈이 된다
🤔모듈을 왜 사용하는 거지?
- 코드 베이스를 분리할 수 있고 이를 통해서 코드를 구조적으로 관리할 수 있다
- 코드를 재사용 가능하게 만들어준다 모듈화(modularize)
- 모듈의 인터페이스만 노출시킬 수 있다 인터페이스 이외 모든 정보를 은닉하는 정보은닉을 구현할 수 있다
- 종속성을 관리할 수 있다
모듈을 사용하는 방법은 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라는 도구를 사용해서 사용할 수 있다
- mongoose 문서(Document)는 각 데이터 하나하나 1개 이상의 key-value를 말한다
- mongoose 컬렉션(Collection)은 JSON형식의 여러 가지 문서(Document)를 보유할 수 있다 관계형 데이터베이스(MySQL)의 Table과 동일하다
- mongoose 스키마(Schema)는 컬렉션(Collection)에 들어가는 문서(Document)에 어떤 종류의 값이 들어가는지 정의한다 데이터 모델링할 때 사용한다
- 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;
'과거공부모음' 카테고리의 다른 글
나의 개발일지 TIL(Today I learned) - iptables, 포트포워딩, pm2 (1) | 2022.12.16 |
---|---|
나의 개발일지 TIL(Today I learned) - express.js와 mongoDB를 이용해 게시판 api 만들고 aws에 배포 개인과제!! (0) | 2022.12.16 |
나의 개발일지 TIL(Today I learned) - promise, async, await, 객체리터럴, 에러 핸들링, 클래스, express.js (0) | 2022.12.13 |
나의 개발일지 TIL(Today I learned) - 동기와 비동기, 블로킹과 논블로킹, event loop (0) | 2022.12.12 |
나의 개발일지 WIL(Weekly I learned) - 미니프로젝트 (0) | 2022.12.11 |