본문 바로가기
개발

[Node.js] 8장

by jwcs 2024. 2. 16.
728x90

8.1 NoSQL vs SQL

SQL 장점

  • 엄격한 데이터 입력: 테이블 구조에 맞게 데이터를 입력해야 한다. 이를 통해 데이터 간의 관계를 명확히 할 수 있고, 데이터의 중복을 줄일 수 있다.
  • 복잡한 쿼리 지원: 조인, 서브쿼리등을 이용하여 다양한 데이터를 보다 쉽게 조회할 수 있다.

NoSQL 장점

  • 자유로운 데이터 입력: 컬럼을 따로 지정하지 않는다. 어떠한 데이터든 입력할 수 있기 때문에 유연하다
  • 확장에 용이: 클러스터에 더 많은 서버를 추가하여 증가하는 데이터 및 트래픽 양을 쉽게 처리할 수 있다
  • 빠른 속도: 키로 값을 검색하는 데이터 접근 방식에 최적화되어 있기 때문에 뛰어난 성능을 제공한다

하나의 애플리케이션에 둘 이상의 데이터베이스를 사용할 수 있다. 따라서 각각의 장단점을 이해하고 적절히 배치하여 사용하는 것이 바람직하다.

 

8.2~8.3은 설치이므로 생략

8.4 데이터베이스 및 컬렉션 생성하기

 

  • 데이터베이스 생성

데이터베이스 생성

`use [데이터베이스명]`으로 데이터베이스를 만들 수 있다.

 

  • 데이터베이스 조회

데이터베이스 조회

`show dbs`로 데이터베이스 목록을 확인할 수 있다. 방금 생성한 데이터베이스는 없을 것이다. 최소 한 개 이상의 데이터가 있어야 목록에 표시된다.

현재 사용중인 데이터베이스

`db` 명령으로 현재 사용중인 데이터베이스를 확인할 수 있다.

컬렉션 목록 확인

다큐먼트를 넣으면 컬렉션이 자동으로 생성된다. 생성된 컬렉션을 검색하려면 `show collections`를 사용하면 된다.

 

8.5 CRUD 작업하기

8.5.1 Create(생성)

Create 예시

`db.[컬렉션명].insertOne(다큐먼트)`를 통해 다큐먼트를 생성할 수 있다. 생성 시 `ObjectId`가 출력되는데, 이 오브젝트 아이디가 검색할 때 쓰이는 키이다. 이 키와 함께 create를 할 수도 있다.

ObjectId를 사용 예시

 

8.5.2 Read(조회)

  • find()

read 예시

`db.[컬렉션명].find({})`를 통해 컬렉션 내의 모든 다큐먼트를 조회할 수 있다.

read 예시 - 2

`age: {$gt: '0'}`은 조건을 나타낸다. age가 '0'보다 큰 경우 해당 요소를 출력한다.

`name: 1`은 출력할 필드를 나타낸다. 1은 true, 0은 false를 나타낸다. name을 제외한 필드는 출력하지 않지만 _id 필드는 기본적으로 출력된다. 따라서 _id도 출력하고 싶지 않다면 명시적으로 나타내야 한다.

read 예시 - 3

  • sort 메소드

sort 예시

검색 결과의 정렬 순서를 정한다. 1은 오름차순 -1은 내림차순이다.

 

  • limit 메소드

limit 예시

주어진 숫자만큼 문서의 수를 제한하여 출력한다.

 

  • skip 메소드

skip 예시

주어진 숫자만큼 문서를 건너뛰고 출력한다.

 

8.5.3 Update(수정)

update 예시

`name: "jw"`를 통해 업데이트할 다큐먼트를 지정한다.

`$set: {age: 30, status: "active"}`를 통해 age를 30으로, status를 active로 업데이트한다.

 

`updateOne`은 하나의 다큐먼트만 수정한다. `updateMany`를 사용하면 조건에 일치하는 모든 다큐먼트를 수정할 수 있다.

 

8.5.4 Delete(삭제)

delete 사용 예시

`name: "jw"`인 다큐먼트 하나를 삭제한다. 앞선 예시들과 마찬가지로 `deleteMany`를 통해 다수의 다큐먼트를 삭제할 수도 있다.

 

8.6 몽구스 사용하기

Mongoose는 MongoDB를 위한 Node.js 환경에서 작동하는 객체 데이터 모델링(ODM, Object Data Modeling) 라이브러리다. 몽고디비 자체가 이미 자바스크립트 이지만 굳이 자바스크립트 객체와 매핑하는 이유는 몽고디비에 없어서 불편한 기능을 몽구스가 보완해주기 때문이다. 따라서 스키마를 사용할 수 있다.

 

8.6.1 몽고디비 연결하기

mongoose 사용 예시

  • mongoose.connect()

MongoDB 데이터베이스에 연결하기 위한 메서드이다. 이 메서드는 MongoDB 연결 문자열(URL)과 옵션 객체를 매개 변수로 받는다. 연결이 성공하면 프로미스를 반환하며, 실패하면 에러를 반환한다.

 

  • mongoose.connection.on()

`mongoose.connection` 객체는 데이터베이스의 연결 상태를 나타낸다. `on()` 메서드를 사용하여 특정 이벤트에 대한 리스너를 등록할 수 있다.

  • connected : 데이터베이스에 성공적으로 연결했음
  • error : 연결 과정에서 오류 발생
  • disconnected : 데이터베이스 연결이 끊김

`mongoose.connection.on()`을 사용함으로써 애플리케이션은 다양한 상황에 대응할 수 있다. 대표적으로, 연결이 끊겼을 때 재연결을 시도하는 로직을 구현할 수 있다.

 

8.6.2 스키마 정의하기

user.js
comment.js

Schema 생성자를 사용해 스키마를 만들 수 있다. `_id`를 기본 키로 알아서 생성하므로 따로 적어줄 필요는 없다.

 

`const { Schema } = mongoose;`: mongoose 라이브러리에서 `Schema` 생성자를 구조 분해 할당을 통해 가져온다. `Schema`는 MongoDB 컬렉션의 구조를 정의하는 데 사용된다.

 

`const { Types: { ObjectId } } = Schema;`: `Schema` 객체 내의 `Types` 객체에서 `ObjectId`를 구조 분해 할당을 통해 가져온다. `ObjectId`는 MongoDB에서 독특한 식별자로 사용되는 특수한 데이터 타입이다. Mongoose에서는 이를 통해 문서 간의 관계를 정의할 때 사용된다.

 

`type: ObjectId`: ObjectId는 MongoDB에서 제공하는 유니크한 식별자이다. 이 식별자는 `User` 컬렉션의 문서를 참조하기 위해 사용된다.

 

`ref: 'User'`: `User` 컬렉션의 문서를 참조하였다는 것을 나타낸다.

 

8.6.3 쿼리 수행하기

직접 코드를 받아적어보면

실행 예시

이런 식으로 나온다.

728x90
반응형

'개발' 카테고리의 다른 글

[MySQL] 챕터 1. DBMS 개요와 MySQL 소개  (1) 2024.02.26
[Node.js] 로그인, 회원가입 기능 구현  (0) 2024.02.18
[Node.js] 7장  (0) 2024.02.16
[Node.js] 1~6장 복습  (0) 2024.02.15
[Node.js] 6장  (0) 2024.02.08