SQL이 필요한 이유
앱의 데이터는 메모리에만 있으면 재시작 시 사라집니다. 데이터베이스는 데이터를 영구적으로 저장하고 효율적으로 조회합니다.
flowchart LR
APP["앱 서버\n(Node.js, Python)"]
DB[("데이터베이스\n(PostgreSQL, MySQL)")]
APP -->|"SQL 쿼리"| DB
DB -->|"결과 반환"| APP
주요 RDBMS
| 데이터베이스 | 특징 | 사용 사례 |
|---|---|---|
| PostgreSQL | 오픈소스, 강력한 기능 | 웹 앱, 엔터프라이즈 |
| MySQL | 빠름, 광범위 지원 | 웹 서비스 |
| SQLite | 파일 기반, 경량 | 모바일, 소규모 앱 |
| SQL Server | Microsoft | 기업 환경 |
핵심 개념
flowchart TB
subgraph TABLE["users 테이블"]
HEADER["id | name | email | age"]
R1["1 | 철수 | kim@example.com | 25"]
R2["2 | 영희 | lee@example.com | 30"]
R3["3 | 민준 | park@example.com | 28"]
end
- 테이블 (Table): 데이터를 저장하는 2차원 구조
- 행 (Row/Record): 한 건의 데이터
- 열 (Column/Field): 데이터의 속성
- 기본키 (Primary Key): 행을 유일하게 식별하는 열 (보통
id) - 외래키 (Foreign Key): 다른 테이블의 기본키를 참조
실습 환경 설정
옵션 1: SQLite (가장 간단)
# Python에 기본 포함
python3 -c "import sqlite3; print('SQLite OK')"
# 또는 SQLite 브라우저 다운로드
# https://sqlitebrowser.org
옵션 2: PostgreSQL (권장)
# Docker로 실행
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 \
postgres:16
# 접속
psql -h localhost -U postgres
첫 번째 SELECT
-- 모든 열, 모든 행 조회
SELECT * FROM users;
-- 특정 열만 조회
SELECT name, email FROM users;
-- 결과 예시
-- name | email
-- ------|----------------
-- 철수 | kim@example.com
-- 영희 | lee@example.com
테이블 생성 미리보기
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 자동 증가 정수
name VARCHAR(100) NOT NULL,
email VARCHAR(200) UNIQUE NOT NULL,
age INTEGER,
created_at TIMESTAMP DEFAULT NOW()
);
SQL 명령어 분류
flowchart LR
subgraph DDL["DDL (구조)"]
D1["CREATE"]
D2["ALTER"]
D3["DROP"]
end
subgraph DML["DML (데이터)"]
M1["SELECT"]
M2["INSERT"]
M3["UPDATE"]
M4["DELETE"]
end
subgraph DCL["DCL (권한)"]
C1["GRANT"]
C2["REVOKE"]
end
정리
| 개념 | 설명 |
|---|---|
| SQL | 데이터베이스 조작 언어 |
| 테이블 | 행과 열로 구성된 데이터 저장 구조 |
| 기본키 | 각 행의 고유 식별자 |
| 외래키 | 테이블 간 관계 정의 |
| SELECT | 데이터 조회 |
다음 편에서는 SELECT 기초 — 원하는 데이터를 정확히 꺼내는 다양한 조회 방법을 배웁니다.