infra
Platform

모듈 맵

[Database] 파일 시스템의 한계와 데이터베이스 관리 시스템(DBMS)의 탄생

0 / 37 완료

펼치기
0 / 37 완료0%

Database · 01 / 37

[Database] 파일 시스템의 한계와 데이터베이스 관리 시스템(DBMS)의 탄생

파일 저장 방식의 한계를 이해하고 데이터베이스가 해결하는 핵심 문제를 파악합니다

초급401 / 37
🚨INCIDENT ALERT
HIGH

모든 데이터를 RDBMS에 넣을 수도 있고, 모든 것을 NoSQL로 밀어붙일 수도 있습니다. 하지만 실제 서비스에서는 정합성, 조회 패턴, 확장 방식에 따라 선택이 달라집니다. DB 패러다임을 비교할 수 있어야 기술 선택이 유행이 아니라 근거가 됩니다.

이번 챕터에서 배울 것

파일로 데이터를 관리할 때 마주치는 실질적인 문제들을 살펴보고, DBMS가 그 문제들을 어떤 방식으로 해결하는지 이해합니다. 이 챕터는 이후 모든 데이터베이스 학습의 출발점이 됩니다.

  • 1파일 저장 방식의 5가지 근본적 한계
  • 2DBMS의 정의와 역할
  • 3관계형 데이터베이스의 역사
  • 4ACID 트랜잭션 개념 미리보기
  • 5데이터베이스가 해결하는 핵심 문제들

데이터베이스 패러다임 — 왜 파일 대신 DB를 쓰는가

신입 때 사수한테 "왜 파일에 저장하면 안 되냐"고 물어봤다가 "DB 쓰면 되잖아"라는 답만 돌아온 적이 있다. 그 말이 와닿지 않아서 사이드 프로젝트에 CSV 파일로 사용자 데이터를 저장했고, 배포 3주 만에 동시 가입 요청이 겹치면서 한쪽 데이터가 조용히 사라지는 상황을 겪었다. 에러 로그도 없었고, 어느 사용자의 데이터가 날아갔는지조차 알 수 없었다. 파일은 두 프로세스가 동시에 쓰면 나중에 저장한 쪽이 먼저 저장된 내용을 덮어쓴다 — 파일 시스템은 이걸 막아주지 않는다. 이 모듈은 그 경험이 왜 구조적으로 불가피한지, 그리고 DBMS가 어떤 메커니즘으로 그 문제를 시스템 수준에서 차단하는지를 설명한다. "DB 쓰면 되잖아"의 진짜 이유를 여기서 처음으로 제대로 이해하게 된다.

서비스 출시 3주차. 동시 접속자 50명이 넘어가던 날 밤, 주문 처리 도중 에러 로그가 쏟아집니다. 원인을 추적해보니 두 사용자가 동시에 같은 CSV 파일에 주문을 기록하다가 나중에 저장한 쪽이 먼저 저장된 내용을 덮어쓴 것입니다. 고객 A의 주문이 데이터베이스 어디에도 없습니다. 환불을 해야 할지, 주문을 다시 받아야 할지도 불분명합니다.

CSV 파일에 데이터를 저장하는 것은 처음엔 합리적인 선택처럼 보입니다. 코드가 단순하고, 파일을 열면 내용이 바로 보입니다. 하지만 사용자가 늘고 동시 요청이 증가하는 순간, 파일 기반 저장의 한계가 한꺼번에 드러납니다. 이 모듈에서는 그 한계가 구체적으로 어떤 상황에서 발생하는지, 그리고 데이터베이스 관리 시스템(DBMS)이 어떻게 그 문제들을 구조적으로 해결하는지 살펴봅니다.


💡개념

파일 저장의 한계 — 왜 엑셀과 CSV는 실무에 부족한가

팀의 데이터를 엑셀로 관리하다가 두 사람이 동시에 수정하면서 데이터가 꼬였습니다. 파일이 여러 개 복제되면서 어느 게 최신 버전인지도 모르게 됩니다. 수만 건에서 특정 조건을 검색하면 수 초씩 걸리고, 잘못된 데이터가 들어가도 막을 방법이 없습니다. DBMS가 왜 필요한지 이해하려면 파일 방식의 구체적인 한계를 먼저 알아야 합니다.

파일 저장의 한계 — 왜 엑셀과 CSV는 실무에 부족한가

파일 기반 데이터 관리의 현실

스타트업 초기 단계에서 개발자들은 종종 CSV 파일에 사용자를 추가하고, 이메일로 조회하는 단순한 코드를 작성합니다. 처음에는 잘 동작하는 것처럼 보입니다. 하지만 실제 서비스에 투입되는 순간 다음과 같은 문제들이 연쇄적으로 터져 나옵니다.

문제 1: 동시 쓰기 충돌 (Concurrent Write Conflict)

두 명의 사용자가 동시에 회원가입을 시도하면 프로세스 A와 B가 모두 파일을 읽은 뒤 각자 새 줄을 추가합니다. 나중에 저장하는 쪽이 먼저 저장된 내용을 덮어씁니다. 결과적으로 프로세스 A가 저장한 사용자 데이터는 사라집니다. 이를 Lost Update(유실된 갱신)라고 합니다. 파일 시스템에는 이를 막을 잠금(lock) 메커니즘이 없습니다.

문제 2: 데이터 중복과 불일치

파일 여러 개로 데이터를 관리하다 보면 같은 정보가 여러 곳에 저장됩니다. orders.csv에 고객 이름과 이메일이 주문마다 반복 저장되면, 고객 정보가 바뀌었을 때 모든 파일에서 해당 데이터를 찾아 수정해야 합니다. 하나라도 빠뜨리면 데이터 불일치가 발생합니다.

문제 3: 무결성 제약 없음

CSV 파일에는 나이에 음수가 들어가도, 이메일 형식이 틀려도, 필수 값이 비어 있어도 그냥 저장됩니다. 파일은 데이터의 형식이나 범위를 전혀 검증하지 않습니다.

문제 4: 검색 성능 저하

100만 개의 레코드가 있는 CSV에서 특정 사용자를 찾으려면 파일 전체를 처음부터 끝까지 읽어야 합니다. 이를 Full Scan이라고 하며, O(n) 시간 복잡도를 가집니다. 평균적으로 50만 번의 비교 연산이 필요합니다.

문제 5: 트랜잭션 없음

쇼핑몰 주문 처리에서 "재고 감소 → 주문 생성 → 결제 처리"는 하나의 단위로 성공하거나 실패해야 합니다. 파일 기반에서 두 번째 단계까지 성공한 뒤 시스템이 다운되면, 재고는 줄었고 주문은 생성됐는데 결제 기록은 없는 불일치 상태가 영구적으로 남게 됩니다.

파일 방식 vs DBMS 비교

다섯 가지 문제를 나란히 놓고 보면 파일과 DBMS의 차이가 한눈에 들어옵니다.

항목파일(CSV/JSON)DBMS
동시 쓰기충돌·유실 위험잠금(Lock) / MVCC로 제어
데이터 중복구조적으로 발생정규화로 방지
무결성 검증없음CHECK, NOT NULL, FK 제약
검색 성능O(n) Full ScanO(log n) 인덱스 탐색
트랜잭션없음ACID 보장
동시 접속단일 프로세스 한정다중 연결 지원
💡개념

DBMS가 해결하는 것들 — 동시성, 무결성, 영속성, 검색

두 사용자가 동시에 같은 상품의 마지막 재고를 구매했습니다. 재고가 음수가 됩니다. 서버 재시작 중에 결제 데이터가 유실됩니다. 잘못된 형식의 값이 그대로 저장됩니다. DBMS는 동시성 제어, 무결성 제약, 영속성 보장으로 이 문제들을 시스템 수준에서 차단합니다. 이 네 가지 역할을 이해해야 DB를 단순 저장소가 아닌 엔지니어링 도구로 쓸 수 있습니다.

DBMS가 해결하는 것들 — 동시성, 무결성, 영속성, 검색

DBMS란 무엇인가

**DBMS(Database Management System)**는 데이터를 체계적으로 저장, 관리, 검색하기 위한 소프트웨어 시스템입니다. 1970년 Edgar F. Codd가 IBM에서 관계형 모델을 제안한 이후, 오늘날 PostgreSQL, MySQL, Oracle, SQL Server 등 수많은 RDBMS가 이 원칙을 구현하고 있습니다.

애플리케이션은 SQL 쿼리를 DBMS 엔진으로 보내고, 엔진은 내부적으로 쿼리 파싱 → 실행 계획 수립 → 트랜잭션 처리 → 잠금 관리 → 디스크 I/O 순서로 처리합니다. 개발자는 이 복잡한 과정을 SQL 한 줄로 요청하기만 하면 됩니다.

ACID: DBMS의 핵심 보장

DBMS가 파일과 근본적으로 다른 이유는 ACID 트랜잭션을 보장하기 때문입니다.

속성영문의미예시
원자성Atomicity전부 성공 or 전부 실패계좌 이체: 출금과 입금이 함께 성공하거나 함께 취소
일관성Consistency제약조건 항상 유지잔액은 항상 0 이상
격리성Isolation동시 트랜잭션 간 간섭 없음A가 이체 중일 때 B가 잘못된 잔액을 읽지 않음
내구성Durability커밋 후 데이터 영속 보장전원이 꺼져도 커밋된 데이터는 유지

ACID의 각 속성은 트랜잭션 모듈에서 구체적인 메커니즘과 함께 자세히 다룹니다. 이 모듈에서는 "DBMS가 이 네 가지를 보장한다"는 사실만 기억하면 충분합니다.

동시성 제어: 잠금(Lock)과 MVCC

DBMS는 동시 접근을 제어하기 위해 잠금(Lock) 또는 **MVCC(Multi-Version Concurrency Control)**를 사용합니다. PostgreSQL은 MVCC를 기본으로 채택합니다. 아래 예시에서 두 UPDATE는 하나의 트랜잭션으로 묶여 원자적으로 처리됩니다. 중간에 실패하면 두 변경 모두 롤백됩니다.

SQL
BEGIN;
UPDATE accounts SET balance = balance - 100000 WHERE id = 1;
UPDATE accounts SET balance = balance + 100000 WHERE id = 2;
COMMIT;
OUTPUT
실행 완료 또는 조회 결과가 표시됩니다.
🔍실행 후 확인할 것
  • 정합성 모델강한 정합성이 필요한 데이터인지 유연성이 우선인지 확인합니다.
  • 조회 패턴키 기반 조회, 관계형 조인, 문서 검색 중 무엇이 핵심인지 봅니다.
  • 운영 복잡도팀이 백업·스케일링·장애 대응을 감당할 수 있는지 판단합니다.

인덱스: 검색 성능 혁신

DBMS는 B-Tree 등의 자료구조를 사용한 인덱스를 제공합니다. 인덱스 없이는 100만 건 중 1건을 찾으려면 최대 100만 번 비교가 필요하지만, B-Tree 인덱스가 있으면 최대 20번 비교로 충분합니다(O(log n)). 아래에서 인덱스를 생성하면 이후 email 조건 검색에 Full Table Scan 대신 인덱스가 자동으로 사용됩니다.

SQL
CREATE INDEX idx_users_email ON users(email);

SELECT * FROM users WHERE email = 'kim@example.com';

무결성 제약: 잘못된 데이터 차단

테이블 정의에 제약조건을 걸면 DBMS가 INSERT/UPDATE 시점에 자동으로 검증합니다. 아래 테이블에 나이가 음수이거나 이메일이 중복된 행을 삽입하려 하면 DB가 즉시 오류를 반환합니다.

SQL
CREATE TABLE users (
    id        SERIAL PRIMARY KEY,
    name      VARCHAR(100) NOT NULL,
    email     VARCHAR(255) UNIQUE NOT NULL,
    age       INT CHECK (age >= 0 AND age <= 150),
    created_at TIMESTAMP DEFAULT NOW()
);

역사적 맥락: 관계형 DB의 탄생

  • 1970년: Edgar F. Codd, IBM 연구소에서 관계형 모델 논문 발표
  • 1974년: IBM System R 프로젝트 — SQL의 전신인 SEQUEL 개발
  • 1979년: Oracle(Relational Software Inc.)이 최초 상용 RDBMS 출시
  • 1986년: SQL이 ANSI 표준으로 채택
  • 1989년: PostgreSQL의 전신 Postgres 프로젝트 시작 (UC Berkeley)
  • 1995년: MySQL 첫 공개 릴리스
  • 현재: 클라우드 네이티브 환경에서도 PostgreSQL, MySQL이 가장 널리 사용

파일 저장에서 DBMS로의 전환은 단순한 기술 선택이 아닙니다. 데이터를 진지하게 다루기 시작하는 순간, DBMS는 선택이 아닌 필수입니다.

두 팀원이 동시에 같은 CSV 파일을 열어 각자 행을 추가한 뒤 저장하면, 나중에 저장한 사람의 파일이 앞 사람의 변경 내용을 덮어씁니다. 파일 시스템에는 동시 쓰기를 중재하는 잠금 메커니즘이 없기 때문입니다.

해결책은 DBMS로 전환하는 것입니다. DBMS는 모든 쓰기 작업에 트랜잭션을 적용하고 내부적으로 잠금을 관리하므로, 동시에 수백 명이 쓰기 작업을 해도 데이터 유실이 발생하지 않습니다. 팀 공유 데이터가 10행을 넘어서는 순간부터 SQLite라도 도입할 것을 권장합니다.

💼
실무 맥락신입 개발자가 팀장에게 '왜 엑셀 대신 DB를 써야 하나요?'라는 질문을 받는 상황
현업 패턴

엑셀이나 CSV가 익숙한 팀원에게 DB 도입을 설득해야 할 때는 기술 용어보다 비즈니스 리스크로 접근하는 것이 효과적입니다. "두 명이 동시에 수정하면 데이터가 사라질 수 있다", "잘못된 값이 들어가도 막을 방법이 없다", "10만 건이 넘으면 검색하는 데 몇 분씩 걸린다"는 구체적인 시나리오를 제시하세요.

ACID의 세부 내용은 이 단계에서 설명하지 않아도 됩니다. "DB는 동시 수정 충돌을 자동으로 해결하고, 잘못된 데이터를 저장 전에 차단하며, 100만 건도 즉시 검색합니다"라는 세 문장만으로도 충분히 설득력이 있습니다.

다음 모듈에서는 요구사항을 ERD로 시각화하고 정규화 원칙으로 테이블 구조를 설계하는 방법을 다룹니다.

지식 확인

퀴즈 — 5문제

Q1

두 사용자가 동시에 같은 CSV 파일에 데이터를 쓰려 할 때 발생하는 가장 심각한 문제는 무엇인가요?

Q2

DBMS(Database Management System)의 핵심 역할이 아닌 것은?

Q3

주문 테이블에 user_id 외래키 컬럼이 있는데, 아직 존재하지 않는 user_id(예: 99999)로 주문을 INSERT 시도했습니다. DB가 이 INSERT를 거부했습니다. 이것은 DB의 어떤 기능 때문인가?

Q4

팀 5명이 공유 엑셀 파일로 주문 데이터를 관리하다가 데이터베이스로 전환해야 할 시점을 판단하는 가장 적절한 기준은?

Q5

결제 처리 중 네트워크 오류로 '카드 승인'은 완료됐지만 '주문 생성' 쿼리가 실패했습니다. 고객 카드에서 돈이 빠져나갔지만 주문 데이터가 없는 상태가 됐습니다. ACID 중 어떤 속성이 지켜졌다면 이 문제를 막을 수 있었는가?

0 / 5 답변

🧪 실습으로 확인하기

PostgreSQL 설치 및 기본 설정

초급

Ubuntu 서버에 PostgreSQL을 설치하고, 데이터베이스와 사용자를 생성한 뒤 외부 접속이 가능하도록 설정한다.

40📋 5단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요

database입문 · 35
[Database] 테이블, 스키마, 로우(Row), 컬럼(Column) 용어 완벽 가이드
Database 트랙 계속
linux입문 · 30
[Linux] 개발자가 왜 리눅스 서버와 커맨드라인을 반드시 배워야 하는가
Linux 트랙 시작점