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

Day 28: 데이터베이스 (SQL vs NoSQL)

1. 오늘의 학습 목표

학습 목표: 웹 애플리케이션의 데이터를 영구적으로 저장하는 데이터베이스의 필요성을 이해합니다. 정형화된 데이터를 다루는 관계형 데이터베이스(SQL)와 유연한 데이터를 다루는 비관계형 데이터베이스(NoSQL)의 핵심적인 차이점과 각각의 장단점을 비교하여 설명할 수 있습니다.

 

핵심 요약: 어떤 데이터베이스를 선택하느냐는 애플리케이션의 성능, 확장성, 개발 편의성에 큰 영향을 미칩니다. 데이터의 특성에 맞는 최적의 데이터베이스를 선택하는 안목을 기르는 것이 이번 시간의 목표입니다.


2. 핵심 개념 파헤치기

2.1. 데이터베이스란?

데이터베이스는 여러 사람이 공유하여 사용할 목적으로, 체계적으로 통합·관리되는 데이터의 집합입니다. Day 27에서 만든 메모리 배열은 서버를 끄면 데이터가 사라지지만, DB는 데이터를 파일이나 디스크에 저장하여 영속성을 보장합니다.

 

2.2. 관계형 데이터베이스

SQL은 관계형 데이터베이스에서 데이터를 관리하기 위해 사용하는 언어입니다.

구조: 모든 데이터는 정해진 스키마에 따라 테이블에 저장됩니다. 테이블은 행, 열으로 구성된 엑셀 시트와 유사합니다.

특징

  • 엄격한 스키마: 데이터는 정해진 형식에 맞춰야만 저장할 수 있어 데이터의 무결성을 보장합니다.
  • 관계: 테이블 간의 관계를 통해 데이터를 연결하고, JOIN을 사용하여 여러 테이블의 데이터를 조합할 수 있습니다.
  • 트랜잭션(ACID): 데이터 처리의 안정성을 보장하는 ACID(원자성, 일관성, 고립성, 지속성) 특성을 따릅니다.

예시: MySQL, PostgreSQL, Oracle DB

 

2.3. 비관계형 데이터베이스

NoSQL은 'Not Only SQL'의 약자로, 관계형 모델과 다른 다양한 형태의 데이터 저장 방식을 제공합니다.

구조: 정해진 스키마가 없어 자유로운 형태로 데이터를 저장할 수 있습니다. 가장 대표적인 형태가 JSON과 유사한 도큐먼트 모델입니다.

 

특징

  • 유연한 스키마: 데이터 구조를 미리 정의할 필요가 없어 개발이 빠르고, 데이터 모델을 유연하게 변경할 수 있습니다.
  • 수평적 확장성: 더 많은 서버를 추가하여 시스템을 확장(Scale-out)하기 용이하여 대용량 데이터를 처리하는 데 유리합니다.
  • 다양한 모델: Document, Key-Value, Column-family 등 데이터 특성에 맞는 다양한 모델을 선택할 수 있습니다.

예시: MongoDB (Document), Redis (Key-Value)


3. 코드로 배우기

3.1. 구현 목표

'한 명의 사용자는 여러 개의 게시글을 작성할 수 있다'는 관계를 SQL과 NoSQL 방식으로 각각 어떻게 모델링하는지 비교합니다.

 

3.2. [1단계: SQL 데이터 모델링 (정규화)]

사용자(users) 테이블과 게시글(posts) 테이블을 분리하고, posts 테이블에 user_id라는 외래 키(Foreign Key)를 두어 두 테이블을 연결합니다. 데이터를 중복 없이 관리하는 정규화 방식입니다.

-- users 테이블 (사용자 정보)
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL
);

-- posts 테이블 (게시글 정보)
CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  content TEXT,
  user_id INT,
  FOREIGN KEY (user_id) REFERENCES users(id) -- users 테이블의 id를 참조
);

 

3.3. [2단계: NoSQL 데이터 모델링 (비정규화)]

사용자 정보를 담는 도큐먼트 안에 그 사용자가 작성한 게시글들을 배열 형태로 포함시킵니다. 관련 데이터를 하나의 도큐먼트에서 관리하여 조회가 빠른 비정규화 방식입니다

//MongoDB와 같은 Document DB에서의 데이터 표현

//사용자 "Alice"의 도큐먼트
{
  "_id": "ObjectId('some-unique-id')",
  "name": "Alice",
  "email": "alice@example.com",
  "posts": [
    {
      "title": "My First Post",
      "content": "This is the content of my first post."
    },
    {
      "title": "Learning NoSQL",
      "content": "NoSQL is flexible!"
    }
  ]
}