아마 거의 없을 것입니다. 하지만 "DB를 정확히 설명할 수 있는 사람"은 어떨까요? 의외로 많지 않습니다. 매일 사용하지만 정작 본질은 흐릿한 개념, 그것이 바로 데이터베이스입니다. 이번 글에서는 화려한 최신 기술을 잠시 내려놓고, 가장 기본으로 돌아가서 DB를 처음부터 차근차근 다시 정리해 보겠습니다.
개발을 하든, 인프라를 다루든, 심지어 단순히 엑셀로 데이터를 정리하든 우리는 모두 어떤 형태로든 데이터베이스를 마주합니다. 그러나 "데이터베이스가 무엇인가요"라는 질문을 받으면 대부분 "데이터를 저장하는 곳" 정도로 답하고 멈춥니다. 이 글은 바로 그 멈춘 지점부터 다시 시작하는 글입니다. 신입 개발자에게는 든든한 기초를, 경력자에게는 익숙함에 가려져 있던 본질을 다시 비춰주는 거울이 되었으면 합니다.
데이터베이스의 가장 정확한 정의는 "여러 사람이 공유하여 사용할 목적으로, 통합·저장·관리되는 데이터의 집합"입니다. 단순히 데이터를 모아둔 파일과는 다릅니다. 데이터베이스가 되기 위해서는 네 가지 핵심 특징을 갖춰야 합니다.
중복 최소화
영속성 확보
업무 필수 자료
다수 사용자 공유
많은 분들이 혼용하지만, 데이터베이스(DB)와 DBMS(Database Management System)는 엄연히 다른 개념입니다. DB는 "데이터의 묶음" 그 자체이고, DBMS는 그 데이터를 효율적으로 다루기 위한 소프트웨어입니다. 우리가 흔히 부르는 MySQL, Oracle, PostgreSQL, MongoDB는 모두 DB가 아니라 DBMS입니다.
현재 가장 널리 쓰이는 데이터베이스는 관계형 데이터베이스(RDBMS, Relational Database Management System)입니다. 이름 그대로 데이터들 사이의 "관계(Relation)"를 핵심으로 다룹니다. RDBMS의 데이터는 모두 테이블(Table)이라는 2차원 구조에 저장됩니다.
여기서 가로 한 줄을 행(Row, 또는 Record/Tuple)이라 부르고, 세로 한 줄을 열(Column, 또는 Field/Attribute)이라 부릅니다. 그리고 RDBMS의 영혼이라 할 수 있는 것이 바로 키(Key)입니다.
| 키 종류 | 설명 |
|---|---|
| Primary Key (PK) | 각 행을 유일하게 식별하는 키. NULL 불가, 중복 불가. 테이블당 1개. |
| Foreign Key (FK) | 다른 테이블의 PK를 참조하는 키. 관계(Relation)를 만드는 핵심. |
| Unique Key (UK) | 중복은 허용되지 않지만 NULL은 가능한 키. 여러 개 지정 가능. |
| Composite Key | 두 개 이상의 컬럼을 조합하여 만든 키. |
은행에서 1만 원을 송금했는데 돈은 빠져나갔지만 받는 사람 계좌에는 입금되지 않는다면? 데이터베이스에 가장 치명적인 사고입니다. 이런 일이 일어나지 않도록 RDBMS가 반드시 지켜야 하는 네 가지 속성이 있는데, 앞 글자만 따서 ACID라고 부릅니다.
하나의 트랜잭션은 "전부 성공"하거나 "전부 실패"해야 합니다. 송금 트랜잭션에서 출금만 되고 입금이 안 되는 중간 상태는 절대 허용되지 않습니다.
트랜잭션 전후로 데이터베이스의 무결성 제약 조건은 항상 만족되어야 합니다. PK 중복, FK 위반 등은 일어나선 안 됩니다.
동시에 실행되는 트랜잭션들이 서로 간섭하지 않아야 합니다. 다른 트랜잭션의 중간 상태가 보여서는 안 됩니다.
트랜잭션이 성공적으로 커밋(commit)되면, 시스템이 다운되더라도 그 결과는 영구적으로 보존되어야 합니다.
RDBMS와 소통하기 위한 표준 언어가 SQL(Structured Query Language)입니다. SQL은 사용 목적에 따라 크게 세 가지로 나뉩니다.
| 분류 | 주요 명령어와 용도 |
|---|---|
| DDL (정의) Data Definition | CREATE / ALTER / DROP 테이블, 인덱스, 스키마 등 구조를 정의·변경·삭제 |
| DML (조작) Data Manipulation | SELECT / INSERT / UPDATE / DELETE 실제 데이터를 조회하고 변경 |
| DCL (제어) Data Control | GRANT / REVOKE / COMMIT / ROLLBACK 권한 관리 및 트랜잭션 제어 |
책의 맨 뒤에 있는 "찾아보기"를 떠올려 보시기 바랍니다. 책 전체를 처음부터 끝까지 읽지 않고도 "데이터베이스"라는 단어가 몇 페이지에 있는지 단숨에 찾을 수 있습니다. 데이터베이스 인덱스(Index)가 정확히 같은 역할을 합니다.
인덱스는 SELECT 속도를 극적으로 높여주지만, INSERT/UPDATE/DELETE 속도는 떨어뜨립니다. 데이터가 변경될 때마다 인덱스도 함께 재정렬되어야 하기 때문입니다. 또한 인덱스 자체가 디스크 공간을 차지합니다. "모든 컬럼에 인덱스를 거는 것"은 초보자가 가장 흔히 저지르는 실수입니다.
트랜잭션(Transaction)은 "논리적으로 하나의 작업으로 묶이는 작업의 단위"입니다. 앞서 설명드린 송금 예시처럼, 출금과 입금은 따로따로 일어나서는 안 되는 하나의 트랜잭션입니다.
여러 트랜잭션이 동시에 같은 데이터에 접근할 때 충돌을 막기 위해 사용하는 것이 락(Lock)입니다. 다만 락은 잘못 쓰면 두 트랜잭션이 서로의 락을 기다리며 영원히 멈추는 데드락(Deadlock)을 만듭니다. 그래서 RDBMS는 격리 수준(Isolation Level)을 통해 동시성과 일관성 사이에서 균형을 잡습니다.
| 격리 수준 | 특징 |
|---|---|
| READ UNCOMMITTED | 가장 낮은 수준. 커밋되지 않은 데이터도 읽음(Dirty Read 발생). |
| READ COMMITTED | 커밋된 데이터만 읽음. Oracle, PostgreSQL 기본값. |
| REPEATABLE READ | 같은 트랜잭션 내 동일 쿼리는 항상 같은 결과. MySQL 기본값. |
| SERIALIZABLE | 가장 엄격. 트랜잭션을 순차적으로 실행하는 효과. |
같은 데이터를 여기저기 중복해서 저장하면 어떤 일이 벌어질까요? 한 곳을 수정하고 다른 곳을 빠뜨리는 순간 데이터의 일관성이 무너집니다. 이런 문제를 이상 현상(Anomaly)이라고 부르며, 이를 방지하기 위해 테이블을 쪼개는 과정이 바로 정규화(Normalization)입니다.
정규화는 데이터 무결성을 위한 것이지만, JOIN이 많아져 성능을 떨어뜨릴 수 있습니다. 그래서 실무에서는 의도적으로 중복을 허용하는 반정규화(Denormalization)를 쓰기도 합니다. 정답은 없으며, "정규화로 시작해서 필요할 때만 반정규화한다"가 일반적인 원칙입니다.
2010년대 이후 빅데이터와 클라우드의 흐름과 함께 NoSQL(Not Only SQL)이라는 새로운 패러다임이 등장했습니다. 정형화된 테이블이 아닌, 더 유연한 구조로 데이터를 저장하는 방식입니다.
| 비교 항목 | SQL (RDBMS) |
|---|---|
| 데이터 구조 | 고정된 스키마, 테이블 기반 |
| 대표 제품 | MySQL, PostgreSQL, Oracle, MS SQL |
| 장점 | 강력한 무결성, 복잡한 JOIN, ACID 보장 |
| 적합 영역 | 금융, ERP, 회계 등 정확성이 중요한 시스템 |
| 비교 항목 | NoSQL |
|---|---|
| 데이터 구조 | 유연한 스키마 (Document, Key-Value, Graph 등) |
| 대표 제품 | MongoDB, Redis, Cassandra, DynamoDB |
| 장점 | 수평 확장 용이, 대용량 처리, 빠른 개발 |
| 적합 영역 | 로그, 실시간 분석, 소셜미디어, IoT 데이터 |
여기까지가 일반적인 데이터베이스 입문서의 끝입니다. 그러나 한 단계 더 깊이 들어가면 흥미로운 진실을 마주합니다. 바로 DB의 모든 성능은 결국 그 아래 있는 스토리지(Storage)에 달려있다는 사실입니다.
데이터베이스가 행을 한 줄 INSERT 하는 순간, 실제로는 그 데이터가 메모리(Buffer Pool)에 쓰이고, 트랜잭션 로그(WAL, Write-Ahead Log)가 디스크에 기록되며, 최종적으로 페이지 단위로 데이터 파일이 갱신됩니다. 즉 "DB의 쓰기 속도는 곧 디스크의 fsync 속도"라고 해도 과언이 아닙니다.
최근 몇 년 사이 NVMe SSD가 데이터센터의 표준이 되면서, 기존 SATA SSD나 HDD를 가정한 DB 엔진들의 설계가 도전받고 있습니다. FDP(Flexible Data Placement)처럼 호스트가 데이터의 배치를 직접 제어하는 기술이 등장하면서, DB와 스토리지가 더욱 긴밀하게 협업해 WAF(Write Amplification Factor)를 줄이고 수명과 성능을 동시에 끌어올리는 흐름이 만들어지고 있습니다. DB 엔지니어가 NVMe 명령어 수준까지 이해하면 보이는 풍경이 완전히 달라집니다.
생성형 AI, 벡터 DB, 분산 트랜잭션 등 데이터베이스 분야에는 매년 새로운 기술이 쏟아집니다. 그러나 그 모든 신기술은 결국 오늘 정리한 ACID, 인덱스, 트랜잭션, 정규화라는 단단한 토대 위에 지어집니다. 화려한 신기술에 휩쓸리기 전에, 가끔은 이렇게 가장 기본으로 돌아가 보시기 바랍니다. 진짜 실력은 바로 그 자리에서 자랍니다.
'AI' 카테고리의 다른 글
| 엔비디아 Nemotron 3 Nano Omni 완전 정복: 30B-A3B MoE로 9배 빠른 멀티모달 AI 에이전트의 시대 (0) | 2026.05.14 |
|---|---|
| 클라우드 데이터베이스 완전 정복: AI in DB 시대의 개막과 글로벌 CSP 비교 (0) | 2026.05.13 |
| DeepSeek 3FS 전격 해부: POSIX와 무엇이 다른가? AI 시대 분산 파일시스템 총정리 (0) | 2026.05.13 |
| OLAP vs OLTP 완벽 정복 (0) | 2026.05.13 |
| SPDK가 뭘까? 전격 해부 (0) | 2026.05.13 |