Node.js 교과서 : 8. MongoDB

전지연·2025년 11월 8일

GDGoC_2025

목록 보기
9/16
post-thumbnail

몽고디비 6버전 설치하기(mongod, mongosh)

  • 자바스크립트 사용
  • NoSQL

NoSQL

: SQL을 사용하지 않는 데이터베이스

SQL과 NoSQL 차이

  • NoSQL에 JOIN은 없지만 aggregate로 흉내는 가능함
  • 정해진 형식 없는 빅데이터, 메시징, 세션 관리 등에는 확장성과 가용성을 위해 몽고디비(MongoDB)를 사용한다.

설치

  1. 몽고디비 공식 사이트에서 설치한다(6버전 이상으로 다운로드)

설치과정 유의점

Complete 선택Service로 설치하는 선택은 해제
  1. 설치 이후에는 C:\data\db 를 만들어준다.
  1. 몽고디비 설치 경로에 들어가서 터미널을 실행한다.

    설치 경로 : C:\Program Files\MongoDB\Server\8.2\bin

터미널에서 다음과 같은 명령어 실행(PowerShell에서 사용)

./mongod --ipv6
  1. 몽고디비 셸 공식 사이트에서 셸을 설치한다.

  2. 설치 후 몽고디비 셸 위치(C:\Users\user\Downloads\mongosh-2.5.9-win32-x64.zip\mongosh-2.5.9-win32-x64\bin)에 들어가 mongosh.exe를 누르면 압축이 해제된다.

  1. 압축 해제 후 해제된 폴더의 mongosh.exe를 찾아 실행(이때 MongoDB 켜져있는 터미널, mongo shell 총 두 개가 켜져있어야 함)

  2. 몽고디비 셸에서 관리자 계정 추가

  1. 3에서 실행한 터미널을 닫은 후, 다시 열어 MongoDB가 있는 위치로 이동한 후 다음과 같은 명령어를 실행한다.
mongod --ipv6 --auth
  1. mongoDB Shell도 종료하고 터미널을 열어 mongoDB 위치로 이동한 후 다음과 같은 명령어 사용
mongosh admin -u root -p [password]

데이터베이스와 컬렉션 만들기

Compass를 통한 커넥션 생성

몽고디비 실행 후 compass로 접속하여 Connection 생성

Connection Options 설정으로Authentication에서 Username, Password, Database 이름 설정

connect 후에 아래와 같이 admin, config, local이 생성

Mongo Shell을 통한 커넥션 생성

몽고 쉘에서 use admin 명령어로 접속한 후 아래와 같은 명령어를 입력한다.

use nodejs

=> show dbs;를 했을때 안보인다(데이터 1개정돈 넣어줘야 조회 가능)

컬렉션 생성

(컬렉션 = 테이블)
몽고 쉘을 통해 users와 comments 컬렉션을 생성해준다.

db.createCollection('users')
db.createCollection('comments')

show collections를 입력하면 컬렉션 목록을 확인할 수 있다.


CRUD 작업하기

Create(생성)

  • 데이터 1개 생성
db.컬렉션명.insertOne(...)

여러 개 생성 시에는 insertMany를 사용한다.

  • ObjectId는 MySQL의 primary key 와 비슷한 키

MongoDB에는 save가 없음
if save 발견 -> 옛날버전 / 몽구스의 save

user과 comment 연결

  • 댓글 1개 => insertOne 사용
  • 댓글의 commenter 자리에 사용자의 ObjectId를 넣어준다.
  • zero의 댓글 만들기

Read(조회)

db.users.find({});
  • 여러 개가 아닌 한 개만 찾을 때는 findOne 사용
  • 특정 필드만 조회 - 두번째 인자에 가져올 필드 1로 표시(_id는 자동이므로 0으로 표기)

Read(조회) - 조건 설정

첫 번째 인수 객체에 기입
=> 시퀄라이즈의 Op와 비슷

  • $gt : 초과
  • $gte : 이상
  • $lt : 미만
  • $lte : 이하
  • $ne : 같지 않음
  • $or : 또는
  • $in : 배열 요소 중 하나
  • age가 30 초과, married가 true인 데이터 조회

Read(조회) - 정렬

sort 메서드 사용

  • 내림차순 : -1
  • 오름차순 : 1
  • 사용자의 나이가 많은 순으로 정렬

Read(조회) - limit

조회할 데이터 개수를 제한
=> limit()

Read(조회) - skip

건너뛸 데이터 개수 설정(offset과 같음)
=> skip()


Update(수정)

db.updateOne({ 수정할 데이터 }, { $set: { 수정할 내용 } });

1개 수정 - updateOne
여러 개 수정 - updateMany

  • $set : 이게 없으면 updateOne의 첫 번째 인자가 통채로 두 번째 인자로 교체됨
    => comment만 수정하고 싶다면 $set 사용

Delete(삭제)

하나만 삭제 - DeleteOne
여러 개 삭제 - DeleteMany


몽구스 사용하기

몽구스 OBM

  • 자바스크립트 사용
  • 몽고디비에 없어서 불편한 기능들 보완
    • schema(스키마) : 테이블
    • populate : JOIN 기능

package.json

터미널에 아래와 같은 명령어로 패키지 설치

$ npm i express morage nunjucks mongoose
$ npm i -D nodemon

몽고디비 연결

schemas = models

몽고디비 연결은 시퀄라이즈와 유사함

schemas/index.js

  • process.env.NODE_ENV !== 'production'
    => 개발 환경일 때만 debug true로 설정
    => 배포 환경에서는 쿼리 내용 보이지 않도록

  • 몽구스와 몽고디비 연결 => 주소 사용
    nodejsbook은 비밀번호 -> 실제 사용시 실제 비밀번호 사용

  • admin은 로그인을 위한 db -> 주소에 작성
    nodejs는 실제 데이터 저장할 db -> 인수에 작성

  • useNewUrlParser, useCreateIndex : 둘 다 true, 아니면 에러 발생

  • 에러 이벤트 리스너 -> 에러 발생시 기록 및 재연결 시도

  • modules.exports = connect는 app.js에 연결

connect 실행되면서 몽고디비 연결

몽구스 스키마 사용하기

user, comment 테이블 생성 -> 스키마 사용

user.js

  • user의 정보인 name, age, married, comment, createdAt을 작성
  • 각 칼럼의 타입을 작성하고, null/not null을 required로 작성
  • required가 false이고 나머지도 표시할 게 없으면 생략 가능하다(comment처럼)

comment.js

  • comment의 속성인 comment, createdAt 작성한 후 commenter에 user스키마 연결

ref를 쓰지 않고 nested Object를 사용하여 ObjectId에 User를 통채로 넣을 수도 있음
예시 :

하지만 이 경우에는 user의 정보가 바뀌면 모든 comment의 정보를 수정해야 하는 단점이 있음


몽구스 실전 프로젝트

사용자 댓글 조회

  • routes/user.js

req.params.id에 ObjectId 문자열 들어감

populate 사용법
1. POST : object id였던 것을 populate하면 실제 zero의 객체로 바꿔줌
(routes/comments.js)

2. GET : commenter로 먼저 찾은 다음 populate
(routes/user.js)

댓글 수정

: update 사용

  • $set 붙이지 않아도 ㄱㅊ -> 기본 설정
  • update 인수 -> 첫 번째 : 조건, 두 번째 : 변경 내용
    (시퀄라이즈랑 반대)

댓글 삭제

: delete 사용

전체 댓글 조회

  • find사용(시퀄라이즈에서는 findAll)

find같은 경우에는 데이터가 쌓일수록 응답 속도가 느려진다.
=> index 사용으로 보완

0개의 댓글