22.1 소개하기
- MongoDB는 관계형 데이터베이스의 스키마, 확장성에서의 한계를 극복한 문서 지향적 NoSQL 데이터베이스.
- 데이터의 구조가 자주 바뀐다면 MongoDB가 유리, 까다로운 조건으로 데이터를 필터링해야 하거나, ACID 특성을 지켜야 한다면 RDBMS가 더 유리할 수 있음.
22.1.1 문서란?
22.1.2 MongoDB 구조
22.1.3 스키마 디자인
22.2 MongoDB 서버 준비
22.2.1 설치
//macOS, Homebrew를 이용하여 설치
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-community
22.2.2 MongoDB 작동 확인
//mongoDB 실행 확인
mongo
//버전 확인
>version()
22.3 mongoose의 설치 및 적용
MongoDB 기반 ODM(Object Data Modelling) 라이브러리. 데이터베이스 문서들을 자바스크립트 객체처럼 사용할 수 있게 해 줌
//mongoose, dotenv 설치
yarn add mongoose dotenv
//dotenv로 환경변수 호출
require('dotenv').config();
const {PORT, MONGO_URI} = process.env;
//mongoose로 서버와 데이터베이스 연결
mongoose.connect(MONGO_URI, {useNewUrlParser: true, useFindAndModify: false}).then(() =>
console.log('connected to MongoDB')).catch(e => console.log(e));
22.4 ems으로 ES 모듈 import/export 문법 사용하기
//Node.js v12를 사용할 경우, package.json에 다음 줄을 추가하면 ES Module을 바로 사용할 수 있음
"scripts" : {
...
},
"type" : "module"
//esm 추가
yarn add esm
// 기존 src/index.js 이름을 main.js로 변경하고, index.js를 아래와 같이 새로 생성
require = require('esm')(module);
module.exports = require('./mains.js');
//package.json 스크립트 변경
"scripts" : {
"start" : "node -r esm src",
"start:dev" : "nodemon --watch src -r esm src/indx.js"
}
//jsconfig.json 파일 추가하면 자동 완성을 통해 모듈을 불러올 수 있음
{
"compilerOptions": {
"target": "es6",
"module": "es2015"
},
"include": ["src/**/*"]
}
22.5 데이터베이스의 스키마와 모델
- 스키마 - 컬렉션에 들어가는 문서 내부의 각 필드가 어떤 형식으로 되어 있는지 정의하는 객체
- 모델 - 스키마를 사용하여 만드는 인스턴스, 데이터베이스에 실제 작업을 처리할 수 있는 함수들을 지니고 있는 객체
22.6 MongoDB Compass의 설치 및 사용
MongoDB를 위한 GUI 프로그램
(www.mongodb.com/try/download/compass)
22.7 데이터 생성과 조회
- 생성 : 모델로 인스턴스를 생성하고 save함수 호출
- 데이터 리스트 조회 : 모델 인스턴스의 find함수를 사용 (exec()를 붙여줘야 서버에 쿼리 요청)
- 단일 데이터 조회 : 모델 인스턴스의 findById 함수를 사용
22.8 데이터 삭제와 수정
- 삭제 : remove - 특정 조건을 만족하는 데이터를 모두 지움, findByIdAndRemove - id를 찾아서 지움 , findOneAndRemove - 특정 조건을 만족하는 데이터 하나를 찾아서 제거
- 수정 : findByIdAndUpdate 함수를 사용. id, 업데이트 내용, 업데이트 옵션을 차례로 파라미터로 받음
22.9 요청 검증
22.9.1 ObjectId 검증
//mongoDB에 적합한 object id인지 검증
import mongoose from 'mongoose';
const { ObjectId } = mongoose.Types;
ObjectId.isValid(id);
//미들웨어를 사용해서 검증이 필요한 컨트롤러에 삽입
export const checkObjectId = (ctx, next) => {
const {id} = ctx.params;
if (!ObjectId.isValid(id)) {
ctx.status = 400;
return;
}
return next();
}
posts.get('/:id', postCtrl.checkObjectId, postCtrl.remove);
22.9.2 Request Body 검증
//Joi 설치
yarn add joi
22.10 페이지네이션 구현
22.10.1 가짜 데이터 생성하기
22.10.2 포스트를 역순으로 불러오기
22.10.3 보이는 개수 제한
22.10.4 페이지 기능 구현
22.10.5 마지막 페이지 번호 알려 주기
22.10.6 내용 길이 제한