데이터베이스란 무엇인가요?
데이터베이스(database)는 프로그램이 빠르고 안전하게 찾고, 추가하고, 변경하고, 삭제할 수 있도록 컴퓨터에 저장한 체계적인 데이터 모음입니다. PostgreSQL, MySQL, SQLite, MongoDB 같은 데이터베이스 관리 시스템(DBMS)이라는 소프트웨어가 이를 관리합니다.
업데이트: 2026년 9월 24일
웹사이트에 로그인하면 사이트는 수백만 개의 계정 중에서 여러분의 계정을 찾고, 비밀번호를 확인하고, 설정을 불러와야 해요. 이 모든 일을 몇 밀리초 안에 하죠. 텍스트 파일을 열어 한 줄씩 읽는 방식이 아니에요. SELECT * FROM users WHERE email = 'ana@example.com' 같은 요청을 데이터베이스에 보내면, 데이터베이스는 책 뒤쪽의 색인처럼 인덱스를 써서 바로 해당 행으로 가요.
데이터베이스는 어떻게 동작하나요
두 가지가 함께 동작해요. 데이터베이스는 정해진 구조로 정리된 데이터예요. 데이터베이스 관리 시스템(DBMS)은 그 데이터를 파일에 저장하고, 일관성을 유지하고, 요청에 답하는 프로그램이에요. PostgreSQL, MySQL, SQLite는 DBMS이고, 여러분의 고객 목록이 데이터베이스예요.
관계형 데이터베이스에서 데이터는 테이블에 들어 있어요. 각 테이블에는 열(이름, 국가, 포인트)과 행(사용자당 하나)이 있어요. 요청은 다음 단계를 거쳐요.
- 프로그램이 쿼리를 보내요. 보통 SQL(Structured Query Language)로 작성해요.
- DBMS가 쿼리를 파싱하고 답을 구할 계획을 세워요. 어떤 테이블을 읽을지, 인덱스로 대부분의 행을 건너뛸 수 있는지 정해요.
- 디스크에서 고정 크기의 페이지 단위로 데이터를 읽고(SQLite는 기본 4,096바이트, PostgreSQL은 8 KB), 자주 쓰는 페이지는 메모리에 둬요.
- 행을 걸러 내고, 정렬하고, 결합한 뒤 결과를 돌려줘요.
Python에는 SQLite가 기본으로 들어 있어서 여기서 바로 실제 데이터베이스를 실행해 볼 수 있어요.
Kenji 340
Omar 340
Ana 120
users: 4 average points: 222.5
프로그램은 어떻게 검색할지는 말하지 않아요. 원하는 결과를 설명하면 DBMS가 그 결과를 얻는 방법을 정해요. 이것이 데이터베이스에 질문하는 것과 리스트를 반복문으로 도는 것의 가장 큰 차이예요.
데이터베이스의 종류
| 종류 | 데이터 저장 형태 | 예시 | 주요 용도 |
|---|---|---|---|
| 관계형(SQL) | 키로 연결된 행과 열의 테이블 | PostgreSQL, MySQL, SQLite, Oracle, SQL Server | 사용자, 주문, 결제: 대부분의 애플리케이션 |
| 문서형 | JSON 같은 문서 | MongoDB, Firestore, CouchDB | 레코드마다 필드가 다른 데이터 |
| 키-값 | 키 하나로 찾는 값 | Redis, DynamoDB | 캐시, 세션, 카운터 |
| 와이드 컬럼 | 여러 서버에 퍼진, 열이 유연한 행 | Cassandra, HBase | 매우 많은 쓰기량 |
| 그래프 | 노드와 노드 사이의 관계 | Neo4j | 소셜 네트워크, 추천 |
| 시계열 | 시간으로 색인한 측정값 | InfluxDB, TimescaleDB | 지표, 센서 측정값 |
| 벡터 | 숫자 목록(임베딩) | pgvector, Pinecone, Milvus | AI 기능을 위한 유사도 검색 |
관계형이 아닌 것은 흔히 NoSQL로 묶어요. 테이블, 제약 조건, SQL이 폭넓은 문제를 잘 해결하기 때문에 관계형 데이터베이스는 여전히 대부분의 애플리케이션에서 기본 선택이에요. 여러 종류를 함께 쓰는 제품도 많아요. PostgreSQL은 JSON 문서를 저장할 수 있고, pgvector는 여기에 벡터 검색을 더해요.
트랜잭션: 전부 아니면 전무
Ana에게서 Ben에게 돈을 옮기려면 변경이 두 번 필요해요. Ben에게 더하고, Ana에게서 빼는 것이죠. 그 사이에 프로그램이 멈추면 돈이 어디선가 생겨나요. 트랜잭션은 변경들을 묶어서 모두 저장되거나 하나도 저장되지 않게 해요. 여기서는 두 번째 변경이 규칙(잔액은 0 아래로 내려갈 수 없음)을 어기므로 데이터베이스가 첫 번째 변경까지 되돌려요.
transfer 30 done
{'ana': 20, 'ben': 30}
transfer 40 failed: CHECK constraint failed: balance >= 0
{'ana': 20, 'ben': 30}
Ben에게 40이 더해졌다가 다시 취소되었으므로 합계는 여전히 맞아요. 관계형 데이터베이스는 트랜잭션에 대해 ACID라고 불리는 네 가지 성질을 보장해요. 원자성(전부 아니면 전무), 일관성(CHECK 같은 규칙이 항상 지켜짐), 격리성(동시에 트랜잭션을 실행하는 두 사용자가 서로의 끝나지 않은 작업을 보지 못함), 지속성(한 번 저장된 변경은 비정상 종료나 정전에도 남음)이에요.
데이터베이스와 스프레드시트, 파일의 차이
| 텍스트 또는 CSV 파일 | 스프레드시트 | 데이터베이스 | |
|---|---|---|---|
| 크기 | 프로그램이 불러올 수 있는 만큼 | Excel에서 시트당 1,048,576행 | 수십억 행 |
| 여러 명이 동시에 쓰기 | 불가능 | 제한적 | 가능, 잠금과 트랜잭션 사용 |
| 레코드 하나 찾기 | 파일 전체 읽기 | 필터 또는 검색 | 인덱스 조회 |
| 데이터 규칙 | 없음 | 선택적 유효성 검사 | 타입, 제약 조건, 외래 키 |
| 질문하기 | 직접 코드 작성 | 수식 | SQL 또는 쿼리 API |
스프레드시트는 한 사람이 수천 행을 들여다보는 데 좋은 도구예요. 여러 프로그램이나 사용자가 동시에 데이터를 쓰거나 데이터가 규칙을 지켜야 한다면 데이터베이스가 맞는 도구예요.
데이터베이스는 데이터를 어떻게 보호하나요
DBMS는 데이터 파일을 건드리기 전에 각 변경을 로그에 먼저 기록해요(선행 기록 로그, write-ahead log). 그래서 비정상 종료 뒤에 끝나지 않은 작업을 다시 실행하거나 되돌릴 수 있어요. PostgreSQL은 8 KB 페이지마다 체크섬을 저장할 수 있고, 고장 난 디스크가 손상된 데이터를 돌려주면 체크섬 실패를 보고해요. 사용자와 권한은 누가 어떤 테이블을 읽거나 바꿀 수 있는지 정하고, 복제는 다른 서버에 사본을 유지해요. 프로그램은 사용자 입력을 위의 ? 자리 표시자처럼 매개변수로 넘겨야 하며, SQL 문자열에 그대로 붙여 넣어서는 안 돼요. SQL 인젝션 공격은 그렇게 해서 일어나요.
흔한 오해
- "SQL이 데이터베이스다." SQL은 언어예요. PostgreSQL, MySQL, SQLite는 그 언어를 이해하는 데이터베이스예요.
- "NoSQL은 SQL을 전혀 쓰지 않는다는 뜻이다." 이 용어는 보통 "not only SQL"로 읽히며, Cassandra의 CQL처럼 SQL과 비슷한 쿼리 언어를 가진 NoSQL 데이터베이스도 여럿 있어요.
- "데이터베이스는 항상 큰 서버다." SQLite는 프로그램이 직접 여는 파일 하나이며 서버가 전혀 없어요. 모든 Android와 iOS 휴대폰 안에서 실행돼요.
- "데이터베이스에 넣은 데이터는 영원히 안전하다." 데이터베이스는 비정상 종료로부터 데이터를 지키지만, 누군가 실수로
DELETE를 실행하는 것까지 막지는 못해요. 백업은 여전히 필요해요.
다음 단계
SQL 강좌는 첫 SELECT부터 쿼리를 가르쳐요. 다음 단계는 SQLite 문서에서 다뤄요. SQLite란 무엇인지, 테이블 만들기, 인덱스, SQL 인젝션 방지를 읽어 보세요. 데이터가 디스크에 어떻게 배치되는지 보려면 바이트란 무엇인지를, 손상된 페이지를 어떻게 감지하는지는 체크섬을 읽어 보세요.