본문 바로가기
개발/웹 개발

Day 31: NoSQL 기초 (MongoDB 모델링)

1. 오늘의 학습 목표

학습 목표: 가장 대표적인 NoSQL 데이터베이스인 MongoDB를 통해 도큐먼트(Document) 기반 데이터베이스의 개념을 이해합니다. 테이블과 행 대신 컬렉션(Collection)과 도큐먼트를 사용하여 데이터를 어떻게 구조화하고 저장하는지 배웁니다. 관계형 데이터베이스와 다른 NoSQL의 데이터 모델링 방식(임베딩 vs. 참조)을 비교하여 익힙니다.

핵심 요약: MongoDB는 JavaScript 개발자에게 매우 친숙한 JSON과 유사한 형태로 데이터를 저장하여, 유연하고 빠른 개발을 가능하게 합니다. 정해진 틀에 얽매이지 않고 데이터를 자유롭게 다루는 방법을 배웁니다.


2. 핵심 개념 파헤치기

2.1. 도큐먼트 데이터베이스란?

도큐먼트 데이터베이스는 데이터를 도큐먼트라는 단위로 관리하는 NoSQL 데이터베이스의 한 종류입니다.

  • 컬렉션 (Collection): 관계형 데이터베이스의 '테이블'에 해당하는 개념입니다. 도큐먼트들의 그룹입니다.
  • 도큐먼트 (Document): 관계형 데이터베이스의 '행(Row)'에 해당하지만 훨씬 더 유연합니다. BSON(Binary JSON)이라는 JSON과 매우 유사한 형태로 구성되며, { "key": "value" } 쌍으로 데이터를 저장합니다.

2.2. 스키마리스 (Schemaless)의 유연함

SQL 데이터베이스는 테이블을 생성할 때 각 열의 데이터 타입을 엄격하게 정의하는 스키마가 필요했습니다. 하지만 MongoDB와 같은 도큐먼트 DB는 스키마가 없습니다(Schemaless). 이는 같은 컬렉션 안에 있더라도 각 도큐먼트가 서로 다른 구조를 가질 수 있음을 의미합니다. 이러한 유연성은 개발 초기나 요구사항이 자주 변경될 때 큰 장점이 됩니다.

 

2.3. 관계 모델링: 임베딩(Embedding) vs. 참조(Referencing)

SQL에서는 JOIN을 통해 관계를 표현했지만, NoSQL에서는 주로 두 가지 방식으로 관계를 모델링합니다.

임베딩 (Embedding / Denormalization): 관련된 데이터를 부모 도큐먼트 안에 배열이나 하위 도큐먼트 형태로 포함시키는 방식입니다.

  • 장점: 관련된 데이터를 한 번의 쿼리로 가져올 수 있어 읽기 성능이 매우 빠릅니다.
  • 단점: 데이터가 중복될 수 있고, 하위 데이터가 너무 많아지면 도큐먼트가 비대해질 수 있습니다.

참조 (Referencing / Normalization): SQL의 외래 키처럼, 다른 컬렉션에 있는 도큐먼트의 고유 ID(_id)를 저장하여 관계를 맺는 방식입니다.

  • 장점: 데이터 중복을 피할 수 있어 데이터 정합성 유지에 유리하고, 각 데이터를 개별적으로 관리하기 좋습니다.
  • 단점: 관련된 데이터를 가져오려면 애플리케이션 레벨에서 여러 번의 쿼리(JOIN과 유사한 작업)가 필요할 수 있습니다.

3. 코드로 배우기

3.1. 구현 목표

'한 명의 사용자는 여러 개의 게시글을 작성할 수 있다'는 관계를 임베딩 방식과 참조 방식으로 각각 모델링해 봅니다.

 

3.2. [1단계: 임베딩(Embedding) 모델]

사용자 도큐먼트 안에 그 사용자가 작성한 게시글을 배열로 직접 포함시킵니다. 사용자와 게시글 정보가 항상 함께 필요할 때 유리합니다.

/*users 컬렉션의 한 도큐먼트*/
{
  "_id": "user01",
  "name": "Alice",
  "email": "alice@example.com",
  "posts": [
    {
      "title": "My First Post",
      "content": "This is content...",
      "createdAt": "2025-09-23T12:00:00Z"
    },
    {
      "title": "Learning MongoDB",
      "content": "It's flexible!",
      "createdAt": "2025-09-24T15:00:00Z"
    }
  ]
}

 

3.3. [2단계: 참조(Referencing) 모델]

users 컬렉션과 posts 컬렉션을 분리합니다. 각 post 도큐먼트는 authorId 필드를 통해 어떤 사용자가 작성했는지를 가리킵니다. 게시글만 따로 조회하거나 수정하는 일이 잦을 때 유리합니다.

/*users 컬렉션의 한 도큐먼트*/
{
  "_id": "user01",
  "name": "Alice",
  "email": "alice@example.com"
}

/*posts 컬렉션의 도큐먼트들*/
{
  "_id": "post123",
  "title": "My First Post",
  "content": "This is content...",
  "authorId": "user01" // users 컬렉션의 _id를 참조
},
{
  "_id": "post124",
  "title": "Learning MongoDB",
  "content": "It's flexible!",
  "authorId": "user01" // users 컬렉션의 _id를 참조
}

 

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

Day 33-35: DB 연동과 인증의 기초  (4) 2024.09.12
Day 32: ORM / ODM  (1) 2024.09.10
Day 29-30: SQL 기초와 심화 (CRUD와 JOIN)  (1) 2024.09.06
Day 28: 데이터베이스 (SQL vs NoSQL)  (1) 2024.09.03
Day 27: CRUD API 구현  (3) 2024.09.02