MongoDB
- NoSQL, Document DB
- 대용량 데이터를 처리하기 좋음
vs. RDB
- RDB
- 관계형 데이터베이스로 관계를 중점적으로 다룬다.
- SQL 질의어 사용
- 데이터 구조화 필요
- NoSQL
- 구조화된 질의어를 사용하지 않음
- 관계보다는 유연하게 저장함
→ RDB는 데이터 구조화 과정 (DDL)이 필요하다. 하지만 NoSQL은 사전작업없이 데이터 베이스를 사용할 수 있다. 즉, 간편하다.
기본 개념
Document DB. 계층화돼있음
- Database
- 하나의 collection을 가질 수 있는 저장소
- SQL의 database
- Collection
- 하나의 Document가 저장되는 공간
- 구조 정의 X
- SQL의 table
- Document
- MongoDB에 저장되는 자료
- 유연한 저장 가능
- 다양한 자료형 지원 (BSON)
- SQL의 row
- ObjectID
- Document의 유일한 키 값
- 자동 생성된다. (timestamp+random val + auto increment)
- SQL의 Primary key
ODM
Objct Data Modeling
Collection에 집중하도록 도와주는 패키지
Collection을 모델화하여 관련 기능을 쉽게 사용할 수 있도록 함
사용 순서
-
스키마 정의
const PostSchema = new Schema({ ~ });
- 다양한 형식을 미리 지정
- 생성, 수정시 데이터 형식을 체크해줌
- timestamps로 생성, 수정 시간을 자동으로 기록
-
모델 생성
mongoose.model(’Post’,PostSchema)
- 스키마를 사용할 수 있는 모델로 만들어야함.
- 모델 이름 지정
-
데이터베이스 연결
mongoose.connect('mongodb://localhost~)
- mongoose는 자동으로 연결 관리를 해준다 → 직접 체크하지 않아도 가능할 때 작업을 실행
-
모델 사용
CREATE | create |
---|
READ | find, findById, findOne |
UPDATE | updateOne, updateMany, findByIdAndUpdate, findOneAndUpdate |
DELETE | deleteOne, deleteMany, findByIdAndDelete, findOneAndDelete |
- create : 배열 전달 시 복수 document 생성 가능. 생성한 Document 반환
- find : query를 사용할 수 있다. (where과 같은 조건절 사용 가능)
- update : 검색된 Doc에 업데이트를 반영하고, find~는 이를 반환한다.
- delete : 검색된 Doc을 삭제하고, find~는 이를 반환한다.
사용하는 이유
- 연결 관리
- 기존 Node.js는 연결 상태를 관리하기 어려움
- Mongoose 사용시 간단하게 데이터베이스와 연결 상태 관리해줌
- 스키마 관리
- 데이터 구조가 미리 정의되면 코드 작성과 프로젝트 관리에 유용하다.
- Code-level로 스키마를 정의하과 관리하게 해준다.
- Populate
- Join을 대신할 수 있음
- 복잡한 aggregate 대신 Mongoose의 Populate를 이용한다.
- Doc안에 Doc을 담지 않고 ObjectId로 참조하는 방법
...
user:{
type:Schema.Types.ObjectId,
ref:'User',
},
comments:{
type:Schema.Types.ObjectId,
ref:'Comment'
}
...
const post = await Post.find().populate(['user','comments'])
Express.js와 함께
프로젝트 구조
project
app.js
⇒ mongoose.connect 작성
models
index.js
⇒ mongoose.model 선언
schemas
커넥션 이벤트
Express.js 어플리케이션은 종료되지 않고 동작
지속적으로 데이터베이스가 정상적으로 작동하는 지 확인이 필요하다.
연결 관련 이벤트에 대한 처리가 필요
mongoose.connect('url')
mongoose.connection.on('~~~~~'.()=>{
})
- connected : 연결 완료시
- disconnected : 연결 끊겼을 시
- reconnected : 재연결 완료시
- reconnectFailed : 재연결 시도 횟수 초과 시
이외 테이블 관계와 쿼리 등 기능을 더 단순화한 Sequelize ORM도 있음