BackEnd Skils

백엔드 입문 (4) - NoSQL DB 알아보기 - 몽고디비

JellyApple 2024. 12. 3. 00:10

1. 데이터베이스 
: 데이터를 체계화하여 관리하는 데이터의 집합 또는 해당 작업을 수행하는 응용 프로그램을 의미함.

: 몽고디비는 NoSQL 데이터베이스. 그 중 도큐먼트 타입이다.
: NoSQL 데이터베이스는 데이터 모델에 따라 키-밸류 , 컬럼, 도큐먼트 , 그래프 타입으로 분류할 수 있다.

2. NoSQL 분류
1) 키-밸류 타입 : 키를 기준으로 데이터를 조회하고 값으로 데이터를 저장한다. 
 ex) Redis, Amazon DynamoDB
2) 도큐먼트 타입 : JSON과 유사한 형식의 객체를 담은 데이터를 저장함.
ex) MongoDB , Couchbase , Firestore 
3) 그래프 타입 : 노드를 사용하여 데이터를 저장하고, 에지를 사용해 데이터 관계를 저장한다.
ex) ArangoDB , Amazon Neptune , Neo4j 

 

* 나는 실제로 DynamoDB가 비록 키 밸류 타입이지만 도큐먼트 DB도 지원하기에 JSON 형태로 데이터를 저장했었던 경험이 있었다. 

 

3. 데이터베이스 기본 용어

1) 테이블 : 특정 주제에 대한 행과 열로 이루어진 데이터의 모음.
2) 행(row) : 관계형 데이터베이스의 테이블에서 단일 구조 데이터 항목을 의미. 레코드라고도 부른다.
3) 컬럼(column) : 관계형 데이터베이스의 테이블에서 특정한 자료의 값 혹은 테이블에서의 열을 의미한다.
4) 기본 키(Primary Key) : 중복된 값을 가질 수 없다. 데이터를 식별할 때 필요한 키

5) 외래키: 두 테이블을 연결 할 때 사용하는 키.

6) RDB : 관계형 데이터베이스라고 하며, 모든 데이터를 2차원의 테이블에 저장한다. 서로 다른 테이블 간에 조인 혹은 외래키로 관계를 맺을 수 있다.

7) 스키마 : 데이터베이스 테이블의 명세를 기술한 데이터. 
ex) 문자열 20자 user_name , 숫자 4자리 password 등과 같은 정보를 정의한 것

8) 모델 : 데이터베이스의 특정 테이블과 테이블에 있는 컬럼들의 형태를 정의한 클래스. 
ex) user 테이블에 대한 모델 -> User 클래스 , 변수로 String userName, int password를 선언해야 함
9) 컬렉션 : 몽고디비에서 사용하는 용어로, 도큐먼트의 집합을 컬렉션이라고 한다. (= 관계형 데이터베이스의 테이블)

10) 조인 : 두 개 이상의 테이블 또는 컬렉션을 조합하여 데이터를 보여주는 기법

11) 트랜잭션 : 데이터 변경을 ㅜㅅ행하는 작업 단위
12) 클러스터 : 데이터 처리량을 높일 목적으로 데이터를 여러 서버(샤드)에 저장하는 기법
13) 샤드 : 큰 데이터베이스를 작은 단위로 분할하는 기능을 의미. 샤드를 사용하여 데이터를 작은 단위로 분할하여 노드(데이터를 가지고 있는 서버)에 분산 시켜 저장할 수 있다. 

 

4. 몽고디비 특징
: BSON 라는 데이터 포맷으로 문서 다룸. Binary JSON의 약자로 JSON을 바이너리 형식으로 저장하는 형태.

: Date와 BinData 타입을 지원한다.

: BSON을 사용하므로 자바스크립트와 호환성이 좋다.

 

5. 몽고디비 아틀라스
: 몽고디비 서버군으로 클라우드 사용할 수 있는 몽고디비 아틀라스가 있다.

: 접속 예시

// test-mongodb.js
const { MongoClient} = require("mongodb");

const uri = "mongodb+srv:<id>:<password>@<cluster_info>/myFirstDatabase?retryWrites=true&w=majority";
const client = new MongoClient(uri);
// MongoDB 클라이언트 객체 생성
client.connect(error => {
    const collection = client.db("test").collection("devices"); // DB 및 컬렉션에 접속
    
    client.close(); // 접속 끊기
 });

 

: 실행 방법

npm i mongodb
node test-mongodb.js

 

// DB 정보 출력하는 test-mongodb2.js
const { MongoClient } = require("mongodb");
const uri = "mongodb+srv://<아이디>:<패스워드>@<클러스터정보>/myFirstDatabase?retryWrites=true&w=majority";
const client = new MongoClient(uri);

async function run() {
   await client.connect();
   const adminDB = client.db("test").admin(); // admin DB 인스턴스
   const listDatabases = await adminDB.listDatabases(); // 데이터베이스 정보 가져오기
   console.log(;istDatabases);
   return "OK";
}

run() 
   .then(console.log)
   .catch(console.error)
   .finally(()=> client.closes());

 

6. 몽고디비 CRUD API 

const MongoClient = require("mongodb").MongoClient;
const url = mongodb+srv://<id>:<password>&<cluster_info>/test?retryWrites=true&w=majority";

// MongoClient 생성
const client = new MongoClient(url, { useNewUrlParser: true });

async function main() {
    try {
       // 커넥션을 생성하고 연결 시도
       await client.connect();
       
       console.log("MongoDB Connected");
       
       // testDB의 User 컬렉션 가져오기
       const collection = client.db("test").collection("User");
       
       // 문서 추가
       await collection.insertOne({ name: "john doe" , age: 30 });
       console.log("insert completed");
       
       // 문서 찾기
       const documents = await collection.find({name: "john doe" }).toArray();
       console.log("Find Document: ", documents);
       
       // 문서 업데이트
       await collection.updateOne({ name: "john doe" }, { $set: {age : 31 } });
       console.log("update completed");
       
       // 업데이트 문서 확인
       const updateDocuments = await collection.find({ name : "john doe" }).toArray();
       console.log("업데이트 문서 :" , updatedDocuments);
       
       
       // 연결 끊기
       await client.close();
       } catch(err) {
          console.error(err);
         }
 }
 
 main();

 

7. 몽고디비 콤파스
: GUI 도구인 몽고디비 콤파스로 데이터를 더 간편하게 확인 가능

 

8. 몽구스

: mongodb 패키지보다 조금 더 편리한 기능을 제공하는 라이브러리다. typeORM 처럼 객체를 도큐먼트로 매핑하는 기능이 있다. 그래서 ODM(object document mapper)라고 부르기도 한다.
: 몽고디비에는 스키마 지정 기능이 없으나 몽구스로는 스키마 지정이 가능하다는 점이 특징이다.

npm install mongoose

 

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

const userSchema = new Schema({ 
    name: String,
    age : Number,
    email : { type: String, required: true },
});

module.exports = mongoose.model('User' , userSchema); // 모델 객체 생성

 

9. REST Client

: VSCode의 REST 클라이언트를 통해 API 테스트 가능하다. 

: .http 파일로 코드를 작성하면 테스트에 사용한 코드가 남아있게 되고 코드 저장소에 저장해 다시 재활용 할 수 있다.

: rest client 익스텐션 설치 후 test.http 등으로 파일을 만들어줌

 

# 변수 설정
@server = http://localhost:3000

### GET 요청 보내기
GET {{server}}/user

### POST 요청 보내기
POST {{server}}/user
Content-Type: application/json

{
  "name": "John Doe",
  "age" : 30,
  "email": "hello@example.com"
}

### 생성한 문서 확인
GET {{server}}/user/hello@example.com