reference:
1) https://www.youtube.com/watch?v=_7UQPve99r4&t=257s
(MERN Stack CRUD API Tutorial, 50분 수강)
✅ Insomnia
Insomnia는 HTTP 및 RESTful API를 테스트하고 디버깅할 수 있는 도구이다. 요청과 응답 데이터를 보기 쉽게 포맷팅한 뒤 표시해주어, API의 동작을 쉽게 이해하고 디버깅할 수 있도록 도와준다.
✅ Dependencies(+CLI)
프로젝트를 초기화하는 CLI이다. 기본값이 설정된 형태의 package.json 파일이 생성된다.
Express를 설치하는 CLI이다. Express는 Node.js에서 웹 애플리케이션 및 API를 구축하기 위한 프레임워크이다. Express를 사용하면 다양한 HTTP 요청을 쉽게 처리하고, 미들웨어를 통해 애플리케이션의 기능을 확장할 수 있다.
1. 간단한 라우팅
2. 플러그인 가능
3. 빠른 서버 설정
Nodemon은 파일의 변경 사항을 감지하여 자동으로 서버를 재시작해주는 도구이다. 개발 과정에서 서버를 수동으로 재시작할 필요 없이, 코드 변경 사항을 자동적으로 반영할 수 있어 개발 효율성을 높일 수 있다.
1. 자동 재시작
2. 개발 편의성 향상
Dotenv는, 환경 변수를 .env 파일에 저장하고 이를 애플리케이션에서 사용할 수 있도록 도와주는 모듈이다. 환경 변수를 통해 중요한 설정값을 코드와 분리하여 관리할 수 있게 된다.
1. 환경 변수 관리
2. 보안 향상
3. 설정의 유연성
MongoDB 모듈은, MongoDB 데이터베이스와 직접 상호작용하기 위한 공식 Node.js 드라이버이다. MongoDB 모듈을 사용하면 MongoDB 데이터베이스에 연결되어 CRUD 작업을 수행할 수 있게 된다.
1. 데이터베이스 연결
2. CRUD 작업 지원
3. 풍부한 기능 제공
Mongoose는 MongoDB를 위한 객체 데이터 모델링 라이브러리이다. 스키마를 정의하고, 데이터를 모델링하며, 데이터 검증 및 관계 설정 등의 기능을 제공한다.
1. 스키마 정의
2. 데이터 모델링
3. 유효성 검사
4. 쿼리 빌더
5. 미들웨어 지원
✅ index.js 파일 분해
const mongoose = require("mongoose");
const ProductSchema = mongoose.Schema(
{
name: {
type: String,
required: [true, "Please enter product name"],
},
quantity: {
type: Number,
required: true,
default: 0,
},
price: {
type: Number,
required: true,
default: 0,
},
image: {
type: String,
required: false,
},
},
{
timestamps: true,
}
);
const Product = mongoose.model("Product", ProductSchema);
module.exports = Product;
const express = require("express");
const mongoose = require("mongoose");
const Product = require("./models/product.model");
const app = express();
require("dotenv").config();
app.use(express.json());
JSON 형식의 요청 본문을 파싱하는 미들웨어를 사용한다.
app.get("/", function (req, res) {
res.send("Hello from Node API Server!!!");
});
app.get("/api/products", async (req, res) => {
try {
const product = await Product.find({});
res.status(200).json(product);
} catch (error) {
res.status(500).json({ message: error.message });
}
});
app.post("/api/products", async (req, res) => {
try {
const product = await Product.create(req.body);
res.status(200).json(product);
} catch (error) {
res.status(500).json({ message: error.message });
}
});
루트 경로에 대한 GET 요청을 처리한다. 응답으로 문자열을 보낸다.
/api/products 경로에 대한 GET 요청을 처리한다. 데이터베이스에서 find 메서드를 통해 모든 product를 조회한 뒤, 조회된 product에 대해 JSON 형식으로 응답한다. 이때, 발생된 오류에 대해서는, 상태 코드 500과 함께 오류 메세지로 응답한다.
/api/products 경로에 대한 POST 요청을 처리한다. 데이터베이스에서 create 메서드를 통해 요청 본문에 포함된 데이터를 사용하여 새로운 product를 생성한다. 생성된 product에 대해 JSON 형식으로 응답을 처리하며, GET과 마찬가지로, 오류가 발생하면 상태 코드 500과 함께 오류 메세지로 응답한다.
mongoose
.connect(process.env.MONGODB_URL)
.then(() => {
console.log("Connected to database!");
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
})
.catch(() => {
console.log("Connection failed!");
});
환경 변수에 설정된 MongoDB URL로 데이터베이스에 연결한다.
데이터베이스 연결에 성공하면 서버를 시작한다.
이때, 데이터베이스 연결에 성공하면, 성공 메세지를 콘솔에 출력한다.
포트 3000에서 서버를 시작하며, 서버 시작에 대한 메세지를 콘솔에 출력한다.
만약 데이터베이스 연결에 실패하면, 지정한 오류 메세지를 콘솔에 출력한다.
const express = require("express");
const mongoose = require("mongoose");
const Product = require("./models/product.model");
const app = express();
require("dotenv").config();
app.use(express.json());
app.get("/", function (req, res) {
res.send("Hello from Node API Server!!!");
});
app.get("/api/products", async (req, res) => {
try {
const product = await Product.find({});
res.status(200).json(product);
} catch (error) {
res.status(500).json({ message: error.message });
}
});
app.post("/api/products", async (req, res) => {
try {
const product = await Product.create(req.body);
res.status(200).json(product);
} catch (error) {
res.status(500).json({ message: error.message });
}
});
mongoose
.connect(process.env.MONGODB_URL)
.then(() => {
console.log("Connected to database!");
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
})
.catch(() => {
console.log("Connection failed!");
});