Node.js

[ NoSQL ] MongoDB 개념과 설정

변쌤(이젠강남) 2024. 6. 10. 17:55
반응형

MongoDB 개념과 설정

 

 

데이터베이스 관리 시스템(DBMS, Database Management System)은 데이터베이스를 생성, 관리, 유지보수하는 소프트웨어입니다.

 

1. 관계형 데이터베이스 관리 시스템(RDBMS)

  • 설명: 테이블 형식으로 데이터를 저장하며, SQL(Structured Query Language)을 사용하여 데이터를 관리합니다.
  • 예시:
    • MySQL: 오픈 소스 RDBMS로 웹 애플리케이션에 많이 사용됩니다.
    • PostgreSQL: 고급 기능을 제공하는 오픈 소스 RDBMS로, ACID 준수를 철저히 합니다.
    • Oracle Database: 대규모 기업 환경에서 많이 사용되는 상용 RDBMS로, 높은 성능과 안정성을 제공합니다.
    • Microsoft SQL Server: 마이크로소프트가 개발한 상용 RDBMS로, Windows 환경에서 많이 사용됩니다.

2. 객체 지향 데이터베이스 관리 시스템(OODBMS)

  • 설명: 객체 지향 프로그래밍 언어와 밀접하게 통합되어 객체 형식으로 데이터를 저장합니다.
  • 예시:
    • db4o: 임베디드 객체 데이터베이스로, Java와 .NET 애플리케이션에 많이 사용됩니다.
    • ObjectDB: Java 환경에서 사용되는 객체 데이터베이스로, JPA(Java Persistence API)를 지원합니다.

3. NoSQL 데이터베이스 관리 시스템

  • 설명: 비관계형 데이터베이스로, 대규모 데이터 처리와 다양한 데이터 구조를 지원합니다. 일반적으로 스키마가 없으며, 수평 확장이 용이합니다.
  • 예시:
    • MongoDB: 문서 지향 데이터베이스로, JSON 유사 형식의 문서로 데이터를 저장합니다.
    • Cassandra: 분산형 데이터베이스로, 높은 가용성과 확장성을 제공합니다.
    • Redis: 인메모리 키-값 데이터베이스로, 빠른 성능을 요구하는 애플리케이션에 적합합니다.
    • HBase: Apache Hadoop 생태계의 일부로, 대규모 데이터 저장 및 처리에 사용됩니다.

4. NewSQL 데이터베이스 관리 시스템

  • 설명: NoSQL의 확장성과 성능을 제공하면서도 RDBMS의 ACID 속성을 유지하는 데이터베이스 시스템입니다.
  • 예시:
    • Google Spanner: 구글이 개발한 분산형 데이터베이스로, 글로벌 분산 트랜잭션을 지원합니다.
    • CockroachDB: 분산형 SQL 데이터베이스로, 높은 가용성과 자동 복구 기능을 제공합니다.

5. 시계열 데이터베이스(TSDB)

  • 설명: 시간 기반 데이터를 효율적으로 저장하고 쿼리하는 데 최적화된 데이터베이스입니다.
  • 예시:
    • InfluxDB: 시계열 데이터베이스로, 성능과 사용 편의성이 뛰어납니다.
    • TimescaleDB: PostgreSQL을 기반으로 한 시계열 데이터베이스로, SQL과 호환됩니다.

6. 그래프 데이터베이스

  • 설명: 노드와 엣지로 구성된 그래프 구조로 데이터를 저장하며, 복잡한 관계를 효율적으로 탐색할 수 있습니다.
  • 예시:
    • Neo4j: 가장 널리 사용되는 그래프 데이터베이스로, 복잡한 네트워크 분석에 적합합니다.
    • ArangoDB: 멀티 모델 데이터베이스로, 그래프 데이터뿐만 아니라 문서와 키-값 데이터도 저장할 수 있습니다.

 

 

MongoDB

 

MongoDB는 NoSQL 데이터베이스 중 하나로, 문서 지향(Document-Oriented) 데이터베이스 관리 시스템입니다. MongoDB는 JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장하며, 스키마가 고정되지 않아 유연하고 확장성이 뛰어납니다.

 

특징

  1. 문서 지향 저장: MongoDB는 데이터를 문서(Document) 형태로 저장합니다. 각 문서는 BSON(Binary JSON) 형식으로, JSON의 확장 버전입니다. 이는 다양한 데이터 타입을 지원하며, 데이터를 더 풍부하고 직관적으로 표현할 수 있습니다.
  2. 스키마리스 구조: MongoDB는 스키마가 고정되지 않은 NoSQL 데이터베이스로, 각 문서의 구조가 동일하지 않아도 됩니다. 이는 애플리케이션의 요구 사항에 맞게 데이터를 유연하게 관리할 수 있게 합니다.
  3. 수평 확장성: MongoDB는 샤딩(Sharding)을 통해 데이터베이스를 여러 서버에 분산하여 저장할 수 있습니다. 이는 대규모 데이터를 처리할 때 성능과 가용성을 높이는 데 도움이 됩니다.
  4. 높은 가용성: MongoDB는 복제 세트(Replica Set)를 통해 데이터의 복제본을 여러 서버에 저장하여 고가용성을 제공합니다. 이는 서버 장애 시 자동으로 복구할 수 있게 합니다.
  5. 강력한 쿼리 언어: MongoDB는 다양한 쿼리 연산자를 제공하여 복잡한 쿼리 작업을 수행할 수 있습니다. 집계 프레임워크(Aggregation Framework)를 통해 데이터 분석 작업도 효율적으로 처리할 수 있습니다.

 

 

몽고DB 설정

 

https://www.mongodb.com/ko-kr

 

MongoDB: 개발자 데이터 플랫폼

업계 최고의 최신 데이터베이스를 토대로 구축된 개발자 데이터 플랫폼을 사용해 아이디어를 더욱 빠르게 실현하세요. 공통 쿼리 인터페이스와 개발자들이 원하는 데이터 모델을 사용하는 동

www.mongodb.com

 

 

1. 무료 체험판 다운로드 

다운로드

 

2. 등록하기 

구글 계정으로 등록 추천

 

등록하기

 

 

 

3. 중간생략

 

4. 개인정보 약관 동일

개인정보 약관동의

 

개인정보 약관 동의

 

 

 

완료

 

 

5. 사용목적외 질문

 

사용목적외

 

 

질문

 

 

 

데이터베이스 사용할

아이디 : 이메일

비밀번호는 자동생성 : 변경가능 ( 따로 복사해 놓으세요 ) 

아이디 비밀번호 설정

 

 

vscode 설치

 

mongodb for vs code

mongodb for vs code

 

 

 

 

 

 

 

커넥션 스트링

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Mongoose

 

설치

npm install mongoose

 

 

https://www.mongodb.com/developer/languages/javascript/getting-started-with-mongodb-and-mongoose/

 

Getting Started With MongoDB & Mongoose | MongoDB

Learn how Mongoose, a library for MongoDB, helps you structure and access data with ease. Mongoose is “elegant MongoDB object modeling for Node.js."

www.mongodb.com

 

 

MongoDB 연결

MongoDB에 연결할 때는 mongoose.connect() 메서드를 사용합니다. 보통 아래와 같은 코드로 연결을 설정합니다.

 

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/mydatabase', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})
.then(() => console.log('MongoDB connected'))
.catch(err => console.error('MongoDB connection error:', err));

 

  • mongoose.connect: MongoDB에 연결하는 메서드입니다. 이 메서드는 비동기적으로 동작하며, 연결이 완료되면 then 블록이 실행됩니다.
  • useNewUrlParser와 useUnifiedTopology: 최신 MongoDB 드라이버와 호환성을 유지하기 위한 옵션입니다.

 

스키마와 모델 생성

Mongoose의 강점은 스키마모델을 사용하여 MongoDB의 데이터를 구조적으로 다룰 수 있다는 점입니다.

  1. 스키마(Schema): MongoDB 컬렉션에서 각 문서(document)가 가져야 할 필드와 데이터 타입을 정의합니다.
  2. 모델(Model): 스키마를 사용하여 데이터베이스와 상호작용할 수 있는 클래스입니다. 모델을 통해 데이터를 삽입, 검색, 수정, 삭제할 수 있습니다.
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  age: { type: Number, required: true },
  email: { type: String, unique: true, required: true },
});

const User = mongoose.model('User', userSchema);

 

 

 

  • userSchema: name, age, email 필드를 가진 사용자 스키마입니다.
    • type: 필드의 데이터 타입을 지정합니다.
    • required: 필수 필드 여부를 지정합니다.
    • unique: 중복이 허용되지 않는 필드로 설정합니다.
  • User: userSchema를 기반으로 만든 모델입니다. 이 모델을 통해 MongoDB의 users 컬렉션과 상호작용할 수 있습니다.

 

CRUD 작업

Mongoose를 통해 MongoDB에서 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 쉽게 수행할 수 있습니다.

 

읽기

const getUsers = async () => {
  try {
    const users = await User.find(); // 모든 사용자 찾기
    console.log('Users:', users);
  } catch (err) {
    console.error('Error retrieving users:', err);
  }
};
getUsers();

 

 

삭제

const deleteUser = async (userId) => {
  try {
    const deletedUser = await User.findByIdAndDelete(userId);
    console.log('User deleted:', deletedUser);
  } catch (err) {
    console.error('Error deleting user:', err);
  }
};
deleteUser('user_id_here');

 

 

수정

const updateUser = async (userId) => {
  try {
    const updatedUser = await User.findByIdAndUpdate(userId, { age: 35 }, { new: true });
    console.log('User updated:', updatedUser);
  } catch (err) {
    console.error('Error updating user:', err);
  }
};
updateUser('user_id_here');

 

 

생성

const createUser = async () => {
  try {
    const user = new User({ name: 'John', age: 30, email: 'john@example.com' });
    await user.save(); // MongoDB에 저장
    console.log('User created:', user);
  } catch (err) {
    console.error('Error creating user:', err);
  }
};
createUser();

 

 


 

 

# todos예시

1.

 

2.

 

3.

 

 

왼쪽 메뉴의 'Clusters'로 이동한 다음 'Connect'를 클릭

 

Drivers 옵션

 

url 복사

 

 

Network Access 설정 

"Allow Access from Anywhere"를 선택하고 "0.0.0.0/0" 입력 

 

 

 

 

Database Access  : 비밀번호 생성 또는 변경 

 

 

 

.env 

DB_USER = username
DB_PASSWORD = userpass
DB_NAME = todo-api

 

 

`mongodb+srv://${DB_USER}:${DB_PASSWORD}@cluster0.dmgijic.mongodb.net/${DB_NAME}?
retryWrites=true&w=majority`;

 

index.js

require('dotenv').config();
const { DB_USER, DB_PASSWORD, DB_NAME } = process.env;

// MongoDB Connection
const MONGO_URL = `mongodb+srv://${DB_USER}:${DB_PASSWORD}@cluster0.dmgijic.mongodb.net/${DB_NAME}?retryWrites=true&w=majority`;
mongoose
    .connect(MONGO_URL, {
        authSource: 'admin',
    })
    .then(() => console.log('MongoDB 연결 성공'))
    .catch((err) => console.error('MongoDB 연결 실패:', err));

 

 

결과

 

frontend                                              몽고db                                     

반응형