icon
12장 : 백엔드 기초와 API

데이터베이스 기초 (SQL vs NoSQL)

지난 장에서는 Node.js와 Express.js를 사용하여 RESTful API를 설계하고 구현하는 방법을 학습했습니다. 이제 여러분은 클라이언트의 요청에 따라 데이터를 주고받는 서버를 만들 수 있게 되었습니다.

하지만 우리가 이전 장에서 구현한 API는 사용자 데이터를 서버 메모리(let users = [...])에 임시로 저장했습니다. 서버를 재시작하면 모든 데이터가 사라지는 휘발성 방식이었죠. 실제 웹 애플리케이션에서는 사용자 정보, 게시물, 상품 목록, 주문 내역 등 방대한 데이터를 영구적으로 저장하고 관리해야 합니다. 또한, 여러 사용자가 동시에 데이터를 요청하거나 변경하는 상황을 안정적으로 처리할 수 있어야 합니다.

이러한 요구사항을 충족시키기 위해 등장한 것이 바로 데이터베이스(Database) 입니다. 데이터베이스는 데이터를 체계적으로 저장하고 관리하는 시스템이며, 백엔드 개발의 핵심 구성 요소입니다. 이번 장에서는 데이터베이스의 기본 개념, 다양한 종류, 그리고 웹 애플리케이션에서 데이터베이스가 어떻게 활용되는지에 대해 알아보겠습니다.


데이터베이스(Database)란?

데이터베이스는 조직적이고 구조화된 정보(데이터)의 집합입니다. 특정 목적을 위해 데이터를 저장하고, 필요할 때 쉽게 검색, 삽입, 업데이트, 삭제할 수 있도록 설계되었습니다.

  • 영구성(Persistence): 데이터는 서버가 재시작되어도 사라지지 않고 영구적으로 저장됩니다.
  • 일관성(Consistency): 데이터의 무결성을 유지하며, 미리 정의된 규칙에 따라 데이터가 정확하고 유효하게 유지됩니다.
  • 동시성 제어(Concurrency Control): 여러 사용자가 동시에 데이터에 접근하고 변경하려 할 때, 데이터 충돌을 방지하고 정확성을 보장합니다.
  • 데이터 독립성: 애플리케이션과 데이터가 분리되어, 한쪽의 변경이 다른 쪽에 미치는 영향을 최소화합니다.

데이터베이스를 관리하는 시스템을 데이터베이스 관리 시스템(DBMS: Database Management System) 이라고 부릅니다. DBMS는 사용자와 데이터베이스 사이에서 데이터를 생성, 관리, 검색하는 데 필요한 인터페이스를 제공합니다.


데이터베이스의 종류

데이터베이스는 크게 두 가지 주요 범주로 나눌 수 있습니다.

관계형 데이터베이스

관계형 데이터베이스 (RDBMS: Relational Database Management System)는 가장 전통적이고 널리 사용되는 데이터베이스 유형입니다. 데이터를 테이블(Table), 행(Row), 열(Column) 의 형태로 구성하며, 각 테이블은 고유한 기본 키(Primary Key)를 가지고, 테이블 간의 관계는 외래 키(Foreign Key)를 통해 설정됩니다.

  • 데이터 모델: 관계형 모델
  • 데이터 저장 방식: 테이블 (스프레드시트와 유사)
  • 쿼리 언어: SQL (Structured Query Language)
  • 주요 특징
    • 정규화: 데이터 중복을 최소화하고 데이터 무결성을 유지하기 위해 데이터를 여러 테이블로 분리하는 과정.
    • ACID 트랜잭션: 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)을 보장하여 데이터의 신뢰성 확보. 특히 금융 시스템처럼 데이터의 정확성이 매우 중요한 곳에서 선호됩니다.
    • 엄격한 스키마: 테이블을 생성할 때 미리 데이터의 구조(컬럼 이름, 데이터 타입 등)를 정의해야 합니다.
  • 장점
    • 데이터 일관성 및 무결성 보장.
    • 정형화된 데이터에 강력.
    • 관계가 복잡한 데이터 모델에 적합.
    • 오랫동안 사용되어 안정적이고 성숙한 기술.
  • 단점
    • 데이터 스키마 변경 시 유연성이 떨어짐.
    • 수평적 확장(Scale-out)이 어려움 (Scale-up은 가능).
    • 비정형 데이터 저장에 부적합.
  • 대표적인 예시
    • MySQL: 가장 인기 있는 오픈소스 RDBMS.
    • PostgreSQL: MySQL과 함께 강력한 오픈소스 RDBMS로, 더 많은 기능과 확장성을 제공합니다.
    • Oracle: 엔터프라이즈 환경에서 널리 사용되는 상용 RDBMS.
    • SQL Server: Microsoft에서 개발한 RDBMS.
    • SQLite: 서버 없이 파일 형태로 데이터를 저장하는 경량 RDBMS (개발 및 소규모 앱에 적합).

NoSQL 데이터베이스

NoSQL (Not Only SQL) 데이터베이스는 관계형 데이터베이스의 한계(스키마 유연성 부족, 확장성 문제)를 극복하기 위해 등장한 비관계형 데이터베이스입니다. 데이터 저장 방식에 따라 다양한 유형으로 나뉩니다.

  • 데이터 모델: 관계형 모델을 따르지 않음.
  • 쿼리 언어: 각 유형 및 데이터베이스마다 다름. (SQL과 유사하거나 독자적인 API 사용)
  • 주요 특징
    • 스키마리스(Schemaless) 또는 유연한 스키마: 데이터의 구조가 미리 정의되지 않아 유연한 데이터 모델링이 가능합니다.
    • 수평적 확장 용이: 분산 환경에서 대규모 데이터 처리 및 확장에 유리합니다.
    • 비정형/반정형 데이터: 텍스트, 이미지, 로그 데이터 등 정형화되지 않은 데이터를 효율적으로 저장하고 처리할 수 있습니다.
    • CAP 이론: 일관성(Consistency), 가용성(Availability), 분할 허용성(Partition tolerance) 중 두 가지만 만족할 수 있다는 이론. NoSQL은 주로 가용성과 분할 허용성을 중시합니다.
  • 장점
    • 대규모 분산 환경에 적합.
    • 유연한 스키마로 빠른 개발 및 변경 가능.
    • 비정형 데이터 저장에 유리.
  • 단점
    • 데이터 일관성 보장이 관계형 DB보다 약할 수 있음.
    • 복잡한 관계를 가진 데이터에는 비효율적.
    • 성숙도가 관계형 DB보다 낮을 수 있음.
  • 대표적인 유형 및 예시
    • 문서 지향 (Document-Oriented): 데이터를 JSON 또는 BSON(Binary JSON)과 같은 문서 형태로 저장합니다. (예: MongoDB, CouchDB)
    • 키-값 (Key-Value): 가장 단순한 형태로, 키와 값의 쌍으로 데이터를 저장합니다. (예: Redis, DynamoDB)
    • 컬럼 지향 (Column-Oriented): 데이터를 열(컬럼) 중심으로 저장하여 대규모 데이터 분석에 유리합니다. (예: Cassandra, HBase)
    • 그래프 (Graph): 노드와 엣지를 사용하여 데이터 간의 관계를 그래프 형태로 표현합니다. (예: Neo4j, Amazon Neptune)

웹 애플리케이션에서 데이터베이스의 역할

백엔드 서버와 데이터베이스는 다음과 같이 협력합니다.

  1. 데이터 저장: 사용자 가입, 게시물 작성, 상품 등록 등 클라이언트로부터 받은 데이터를 데이터베이스에 영구적으로 저장합니다.
  2. 데이터 조회: 클라이언트의 요청에 따라 데이터베이스에서 필요한 데이터를 검색하여 클라이언트에 응답합니다. (예: 게시물 목록 가져오기, 특정 사용자 정보 조회)
  3. 데이터 업데이트: 기존 데이터의 내용을 변경합니다. (예: 게시물 수정, 사용자 프로필 업데이트)
  4. 데이터 삭제: 더 이상 필요 없는 데이터를 데이터베이스에서 제거합니다. (예: 회원 탈퇴, 게시물 삭제)
  5. 비즈니스 로직 지원: 복잡한 비즈니스 규칙(예: 재고 관리, 주문 처리, 권한 부여 등)을 수행할 때 데이터베이스의 데이터를 활용하거나 변경합니다.

백엔드 서버(Node.js + Express.js)는 데이터베이스와 직접 통신하며, 클라이언트(프론트엔드)는 백엔드 API를 통해 데이터베이스의 데이터에 간접적으로 접근하게 됩니다.


SQL 기초 (간략)

가장 널리 사용되는 관계형 데이터베이스 언어인 SQL의 기본적인 문법을 간략하게 살펴보겠습니다.

  • 데이터베이스 생성/선택

    CREATE DATABASE mydatabase; -- 데이터베이스 생성
    USE mydatabase;            -- 데이터베이스 선택
  • 테이블 생성

    CREATE TABLE users (
        id INT PRIMARY KEY AUTO_INCREMENT, -- 정수형, 기본 키, 자동 증가
        username VARCHAR(50) NOT NULL UNIQUE, -- 문자열 50자, NULL 불허, 중복 불허
        email VARCHAR(100) NOT NULL,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- 기본값으로 현재 시간 설정
    );
  • 데이터 삽입 (C: Create)

    INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com');
    INSERT INTO users (username, email) VALUES ('bob', 'bob@example.com');
  • 데이터 조회 (R: Read)

    SELECT * FROM users; -- 모든 사용자 조회
    SELECT username, email FROM users WHERE id = 1; -- ID가 1인 사용자의 이름과 이메일 조회
    SELECT * FROM users WHERE username LIKE 'a%'; -- 'a'로 시작하는 사용자 조회
    SELECT * FROM users ORDER BY created_at DESC; -- 생성일 기준으로 내림차순 정렬
  • 데이터 업데이트 (U: Update)

    UPDATE users SET email = 'alice_new@example.com' WHERE id = 1; -- ID가 1인 사용자의 이메일 변경
  • 데이터 삭제 (D: Delete)

    DELETE FROM users WHERE id = 2; -- ID가 2인 사용자 삭제
  • 테이블 삭제

    DROP TABLE users;

이러한 SQL 쿼리들을 백엔드 서버(예: Node.js)에서 데이터베이스 드라이버 또는 ORM(Object-Relational Mapping) 라이브러리를 통해 실행하여 데이터를 조작하게 됩니다.


마무리하며

이번 장에서는 웹 애플리케이션의 데이터를 영구적으로 저장하고 관리하는 핵심 요소인 데이터베이스의 기초를 학습했습니다.

여러분은 데이터베이스의 영구성, 일관성, 동시성 제어 등의 중요 특징을 이해하고, 데이터를 테이블 형태로 관리하는 관계형 데이터베이스(RDBMS) 와 유연한 스키마 및 수평적 확장에 강점 있는 NoSQL 데이터베이스의 종류와 각각의 특징을 비교했습니다. 또한, 웹 애플리케이션에서 백엔드 서버가 데이터베이스와 연동하여 데이터를 저장, 조회, 업데이트, 삭제하는 과정을 파악했습니다. 마지막으로, 관계형 데이터베이스의 표준 질의 언어인 SQL의 기본적인 CRUD(Create, Read, Update, Delete) 문법을 간략하게 살펴보았습니다.

이제 여러분은 백엔드 개발에서 데이터베이스가 왜 필요하며, 어떤 종류가 있고, 어떻게 데이터를 다루는지에 대한 기본적인 지식을 갖추게 되었습니다. 다음 장에서는 우리가 Express.js 서버에 실제 데이터베이스(예: SQLite 또는 MongoDB)를 연결하여, 앞서 구현한 RESTful API가 메모리 대신 데이터베이스에서 데이터를 관리하도록 수정하는 실습을 진행할 것입니다. 이를 통해 진정한 의미의 영속적인 웹 애플리케이션 백엔드를 구축할 수 있게 될 것입니다.