[엘리스] TIL #18

nerry·2022년 5월 17일
0
post-thumbnail

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을 모델화하여 관련 기능을 쉽게 사용할 수 있도록 함

사용 순서

  1. 스키마 정의

    const PostSchema = new Schema({ ~ });

    • 다양한 형식을 미리 지정
    • 생성, 수정시 데이터 형식을 체크해줌
    • timestamps로 생성, 수정 시간을 자동으로 기록
  2. 모델 생성

    mongoose.model(’Post’,PostSchema)

    • 스키마를 사용할 수 있는 모델로 만들어야함.
    • 모델 이름 지정
  3. 데이터베이스 연결

    mongoose.connect('mongodb://localhost~)

    • mongoose는 자동으로 연결 관리를 해준다 → 직접 체크하지 않아도 가능할 때 작업을 실행
  4. 모델 사용

    CREATEcreate
    READfind, findById, findOne
    UPDATEupdateOne, updateMany, findByIdAndUpdate, findOneAndUpdate
    DELETEdeleteOne, deleteMany, findByIdAndDelete, findOneAndDelete
    • create : 배열 전달 시 복수 document 생성 가능. 생성한 Document 반환
    • find : query를 사용할 수 있다. (where과 같은 조건절 사용 가능)
    • update : 검색된 Doc에 업데이트를 반영하고, find~는 이를 반환한다.
    • delete : 검색된 Doc을 삭제하고, find~는 이를 반환한다.

사용하는 이유

  1. 연결 관리
    • 기존 Node.js는 연결 상태를 관리하기 어려움
    • Mongoose 사용시 간단하게 데이터베이스와 연결 상태 관리해줌
  2. 스키마 관리
    • 데이터 구조가 미리 정의되면 코드 작성과 프로젝트 관리에 유용하다.
    • Code-level로 스키마를 정의하과 관리하게 해준다.
  3. 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'])
      // -> 하위 Document처럼 사용할 수 있도록 함

Express.js와 함께

프로젝트 구조

  • project
    • app.js ⇒ mongoose.connect 작성
    • models
      • index.js ⇒ mongoose.model 선언
      • schemas
        • ~ ⇒ mongoose.Schema 정의

커넥션 이벤트

Express.js 어플리케이션은 종료되지 않고 동작

지속적으로 데이터베이스가 정상적으로 작동하는 지 확인이 필요하다.

연결 관련 이벤트에 대한 처리가 필요

mongoose.connect('url')
mongoose.connection.on('~~~~~'.()=>{
})
  • connected : 연결 완료시
  • disconnected : 연결 끊겼을 시
  • reconnected : 재연결 완료시
  • reconnectFailed : 재연결 시도 횟수 초과 시

이외 테이블 관계와 쿼리 등 기능을 더 단순화한 Sequelize ORM도 있음

profile
터벅터벅 개발(은좋은)자 로그

0개의 댓글

관련 채용 정보