본문 바로가기
프론트엔드

MongoDB는 무엇인가?

반응형

 

코드드림팀은 다음 프로젝트로 [ MongoDB ]를 사용하기로 결정했습니다.

그전에 [ MongoDB ]에 대해서 알아볼까요?

※ MongoDB 설치, 사용법, 예시에 관한 건 에디님의 포스팅에서 확인해 볼 수 있습니다.

 

Next.js + MongoDB

이제 우리는 Next.js로 프로젝트를 시작합니다. 기획 중인 프로젝트는 코드드림의 어드민 서비스를 만들어볼 계획입니다. 본 포스팅에서는 Next.js 프로젝트에서 DB를 연동하는 과정을 소개합니다.

code-dream.tistory.com

 

몽고 DB는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이다.
 NoSQL 데이터베이스로 분류되는 몽고 DB는 JSON과 같은
동적 스키마형 도큐먼트들을 선호함에 따라
전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼간다.
....(중략)

위키백과에서는 몽고DB를 위와 같이 설명하고 있습니다. 

정말 어렵습니다. 하나하나 파악해 봅시다. 

1. 데이터베이스

데이터베이스란 여러 사람들이 공유하고 사용할 목적으로 통합 관리 되는 데이터들의 모임입니다. 

데이터베이스가 등장하기 이전에는 파일 시스템을 사용해서 데이터를 관리했다고 하는데요. 

 

파일 시스템을 사용하면 파일 단위로 저장할때 데이터 종속성 문제와 중복성, 데이터 무결성 문제가 존재하기 때문에

이런 문제를 해결하고자 데이터 베이스가 등장했고 사용하기 시작했다고 합니다. 

2. DBMS

데이터베이스를 '데이터의 모임' 으로 정의한다면, 이런 모임을 관리하고 운영하는 소프트웨어툴을 DBMS라고 합니다.

 

위의 사진에서 보면 Developer, User, App 모두 데이터베이스에 동시에 접근 가능해야겠죠. 

이러한 것을 가능하게 해주는 것이 DBMS 라고 생각하시면 될 것 같습니다. 

대표적으로 MySQL, 오라클(Oracle), SQL 서버, Maria DB 등이 있습니다. 

 

DBMS의 유형은 크게 RDBMS(관계형), NoSQL(비관계형) 으로 나눌 수 있습니다. 

3. RDBMS

관계형 데이터베이스는 테이블, 행, 열의 정보를 구조화하는 방식의 데이터베이스입니다. 

테이블을 조인하여 정보 간 관계를 설정할 수 있는 기능이 있어, 여러 데이터 간의 관계를 쉽게 이해할 수 있습니다. 

 

아래에 [ 회원 TABLE ][ 예약 TABLE ] 이 있습니다.

 

[ 회원 TABLE ]

회원 번호 (PK) 회원 이름  휴대폰 번호
1111 메리 010-1111-1111
2222 에디 010-2222-2222

 

[ 예약 TABLE ]

예약 번호 (PK) 예약 회원 번호(FK) 예약 상품
0000-0001 1111 상품 A
0000-0002 2222 상품 B
0000-0003 3333 상품 C

 

[ 회원 TABLE ]과 [ 예약 TABLE ]는 외래키(foreign key)를 사용해서 테이블 간 Join을 할 수 있습니다. 

[ 회원 TABLE ]의 필드에서 [ 예약 TABLE ] 행을 식별할 수 있는 건 회원번호(=외래키)라고 볼 수 있겠네요. 

그럼 해당 외래키로 두 테이블을 Join 결합시켜 주면, 아래와 같은 결과를 얻을 수 있을 것 같습니다. 

(※ Join에도 여러가지가 있습니다. 아래 결과는 inner join을 사용해 도출한 결과물입니다.)

회원 번호 회원 이름 휴대폰 번호 예약 번호 예약 회원 번호 예약 상품
1111 메리 010-1111-1111 0000-0001 1111 상품 A
222 에디 010-2222-2222 0000-0002 2222 상품 B
외래키(foreign key)
관계형 데이터베이서에서 외래키는 한 테이블의 필드(attribute) 중 다른 테이블의 행(row)을 식별할 수 있는 키를 의미합니다.

4. NoSQL

NoSQL은 RDBMS와 달리 테이블 간의 관계를 정의하지 않습니다. 

그렇기 때문에 테이블 간의 Join도 불가능 합니다. 데이터 테이블은 그냥 하나의 테이블입니다. 

높은 확장성과 가용성이 주요 장점인 NoSQL은 실시간 웹 애플리케이션 및 빅 데이터에서 사용됩니다. 

 

NoSQL은 다양한 형태(4가지)의 저장 기술을 지원합니다. 

NoSQL 저장 기술

5. RDBMS vs NoSQL

  RDBMS NoSQL
장점 정해진 스키마에 따라 데이터 저장
명확한 데이터 구조 보장
데이터 중복 없이 한번만 저장 
스키마가 없기 때문에 자유로운 데이터 구조
데이터 분산이 용이
Scale-up, Scale-down 모두 가능
단점 시스템이 커질 경우 복잡함
Scale-up만 지원해, 비용이 기하급수적으로 높아짐
스키마로 인해 데이터가 유연하지 않음
데이터 중복이 발생할 수 있음
 key키 값에 대한 입, 출력만 지원함
언제? 데이터 구조가 명확하며 변경할 여지가 없는 경우
관계를 맺고 있는 데이터의 변경이 빈번한 경우
데이터가 변경/확장 될 수 있는 경우
Update가 많이 이루어지지 않는 시스템일 경우
막대한 데이터를 저장하는 시스템일 경우
스키마(schema)
데이터베이스의 구조와 제약조건에 관한 전반적인 명세를 기술한 것입니다.
개체의 특정을 나타내는 속성(Attribute)속성들의 집합으로 이루어진 개체(Entity),
개체 사이에 존재하는 관계(Relation)에 대한 정의와 이들이 유지해야 할 제약 조건을 기술한 것입니다.

=> 데이터베이스 내에 어떤 구조로 데이터가 저장되는가를 나타낸 것이라고 볼 수 있습니다. 
Scale-up / Scale-down
Scale-up이란 기존 서버보다 높은 사양으로 업그레이드하는 것을 의미합니다. 
수직 확장이며 성능 확장에 한계가 있고, 고성능 서버는 비용이 크다는 특징이 있습니다. 

Scale-down이란 기존 서버와 비슷한 사양의 서버 대수를 증가시키는 방법으로 처리 능력을 업그레이드하는 것입니다. 수평 확장이며, 지속적인 확장이 가능하고 비교적 저렴한 비용이라는 특징이 있습니다. 

 

1. Mongoose

Mongoose는 MongoDB ODM(Object Document Mapping) 중 가장 유명한 라이브러리입니다. 

데이터베이스의 연결, 스키마 정의, 스키마에서 모델로 변환하는 역할을 하고 있습니다. 

ODM
객체와 문서를 1대 1로 매칭해주는 역할을 합니다. 
즉, MongoDB에 있는 데이터를 NodeJS에서 Javscript 객체로 사용할 수 있도록 해줍니다. 

 

"예? 근데 NoSQL 은 스키마 정의가 없어서 데이터 구조가 자유롭다면서요. 왜 Mongoose를 사용하는 거죠?"

라고 생각 드신 분 최고입니다. 

 

Mongoose는 스키마와 모델 구성을 가져왔으나 제한은 가져오지 않습니다. 

즉, 장점은 가져오고 제한점은 가져오지 않았다~ 이말이죠. 그러니깐 스키마를 반드시 따를 필요는 없는 거죠. 

 

아래 예시를 한번 볼까요?

예시를 보시기 전에 에디님의 포스팅을 보고 오신다면 더 이해가 편하실 거예요!

const UserSchema = new Schema({
    name: {type: String, required: true, unique: true},
    age: {type: Number, default: 1},
    address: String
});

const User = mongoose.model("user", UserSchema);

 

위의 경우에서 name만 required과 unique 속성을 가지므로, 반드시 입력해야 하며 값이 겹치면 안 됩니다.

age의 경우 기본값이 1이고, address의 경우 입력하지 않으면 undefined 상태로 있을 겁니다. 

이런 식으로 스키마를 자신의 방식으로 커스텀하는 것이 굉장히 간편합니다.

 

또한, 자바스크립트 문법을 사용하기 때문에

아래와 같이 객체를 저장하고 수정하는 것도 간단하게 사용할 수 있습니다.

var NewUser = new User({name: 'Eddy', age: 31});

NewUser.address = "광명";

 

제가 RDBMS와 NoSQL을 계속 헷갈리니 에디님이 이번 포스팅을 기획해 주셨습니다.

감사해요. 정. 말.

 

저희는 스터디를 통해 글을 기록하고 있습니다. 피드백은 언제나 환영입니다 :)

 

반응형

'프론트엔드' 카테고리의 다른 글

Vercel로 배포하기  (0) 2024.01.30
Next.js + NextAuth를 활용한 로그인 구현  (1) 2024.01.11
물러가라! Next.js (기초)  (0) 2024.01.10
Next.js + MongoDB  (1) 2024.01.09
자 이제 시작이야, Next 세계로  (3) 2024.01.04