
데이터베이스(Database, DB)는 여러 사람이 공유할 목적으로 체계화하여 통합, 관리하는 데이터의 집합입니다. 단순히 데이터를 저장하는 것을 넘어, 효율적으로 관리하고 필요할 때 신속하게 접근할 수 있도록 지원하는 정보 저장소입니다.
핵심 기능
실생활 예시
1. 실시간 접근성 (Real-Time Accessibility)
2. 계속적인 변화 (Continuous Evolution)
3. 동시 공용 (Concurrent Sharing)
4. 내용에 의한 참조 (Content Reference)

DBMS의 정의
DBMS의 주요 기능
DBMS의 장점
1세대: 계층형 데이터베이스 (Hierarchical DB)
2세대: 망형 데이터베이스 (Network DB)
3세대: 관계형 데이터베이스 (Relational DB)
4세대: NoSQL 데이터베이스
데이터베이스는 여러 구성 요소가 유기적으로 결합하여 데이터를 효과적으로 저장하고 관리합니다. 각 구성 요소의 역할과 관계를 이해하는 것이 중요합니다.

정의: 데이터베이스에서 데이터를 저장하는 기본 단위
구조
예시: 고객 정보 테이블
고객ID | 이름 | 전화번호 | 주소
-------|---------|--------------|------------------
001 | 홍길동 | 010-1234-5678| 서울시 강남구
002 | 김철수 | 010-9876-5432| 부산시 해운대구
003 | 이영희 | 010-5555-1234| 대구시 수성구
정의: 테이블의 각 행(Row)을 의미하며, 하나의 완전한 데이터 단위
특징
예시
정의: 테이블의 열(Column)을 의미하며, 데이터의 특정 속성을 나타냄
필드의 구성 요소
주요 데이터 타입

정의: 독립적으로 존재하면서 고유하게 식별 가능한 실세계의 객체나 개념
엔티티의 특징
엔티티 예시

정의: 데이터베이스의 구조와 제약 조건을 정의한 설계도
스키마의 종류
1. 외부 스키마 (External Schema)
2. 개념 스키마 (Conceptual Schema)
3. 내부 스키마 (Internal Schema)
정의: 테이블에서 레코드를 고유하게 식별하거나 관계를 정의하는 속성
주요 키의 종류

1. 기본 키 (Primary Key, PK)
2. 외래 키 (Foreign Key, FK)
3. 후보 키 (Candidate Key)
4. 대체 키 (Alternate Key)
5. 복합 키 (Composite Key)
정의: 엔티티(테이블) 간의 연관성을 나타내는 개념
관계의 유형

1. 일대일 (1:1) 관계
2. 일대다 (1:N) 관계
3. 다대다 (N:M) 관계
정의: 데이터 검색 속도를 향상시키기 위한 데이터 구조
인덱스의 원리
인덱스의 장점
인덱스의 단점
인덱스 사용 전략
효과적인 데이터베이스를 설계하기 위해서는 체계적인 원칙과 방법론을 따라야 합니다. 데이터 무결성, 정규화, 성능 최적화 등을 고려한 설계가 필요합니다.
정의: 데이터의 정확성, 일관성, 유효성이 유지되는 것
무결성의 종류
1. 개체 무결성 (Entity Integrity)
2. 참조 무결성 (Referential Integrity)
3. 도메인 무결성 (Domain Integrity)
4. 사용자 정의 무결성 (User-Defined Integrity)
정의: 데이터 중복을 최소화하고 무결성을 향상시키기 위해 테이블을 분해하는 과정
정규화의 목적
제1정규형 (1NF)
예시
비정규형:
학생ID | 이름 | 수강과목
001 | 홍길동 | 수학, 영어, 과학
1NF:
학생ID | 이름 | 수강과목
001 | 홍길동 | 수학
001 | 홍길동 | 영어
001 | 홍길동 | 과학
제2정규형 (2NF)
제3정규형 (3NF)
정의: 성능 향상을 위해 의도적으로 중복을 허용하는 과정
역정규화가 필요한 경우
역정규화 기법
주의사항
테이블 명명 규칙
열 명명 규칙
제약 조건 명명
1단계: 요구사항 분석
2단계: 개념적 설계
3단계: 논리적 설계
4단계: 물리적 설계
5단계: 구현 및 테스트
쿼리 최적화
인덱스 전략
테이블 파티셔닝
캐싱 전략

데이터베이스는 크게 관계형 데이터베이스(RDBMS)와 NoSQL 데이터베이스로 구분됩니다. 각각의 철학, 구조, 강점이 완전히 다르며, 프로젝트의 특성에 따라 적절한 선택이 필요합니다.
정의: 테이블 간의 관계를 기반으로 데이터를 구조화하여 관리하는 데이터베이스 시스템
핵심 철학
데이터 모델
스키마
1. 데이터 무결성 보장
2. 표준화된 쿼리 언어
3. 데이터 중복 최소화
4. 성숙한 생태계
1. 확장성 제한
2. 스키마 유연성 부족
3. 성능 이슈
4. 고정된 구조
MySQL
PostgreSQL
Oracle Database
Microsoft SQL Server
MariaDB
SQLite
금융 시스템
전자상거래
ERP/CRM 시스템
회계 시스템
정의: "Not Only SQL"의 약자로, 관계형 모델을 따르지 않는 다양한 형태의 데이터베이스
핵심 철학
데이터 모델
스키마
1. 수평적 확장성
2. 유연한 스키마
3. 높은 성능
4. 대용량 데이터 처리
1. 데이터 일관성 약화
2. 표준화 부족
3. 복잡한 쿼리 제한
4. 성숙도
1. 문서 데이터베이스 (Document Database)
2. 키-값 데이터베이스 (Key-Value Store)
3. 열 지향 데이터베이스 (Column-family Store)
4. 그래프 데이터베이스 (Graph Database)
MongoDB
Redis
Cassandra
Elasticsearch
Neo4j
소셜 미디어 플랫폼
IoT 및 센서 데이터
콘텐츠 관리 시스템
실시간 분석
캐싱 레이어
| 특성 | RDBMS | NoSQL |
|---|---|---|
| 데이터 모델 | 테이블 기반 관계형 | 문서, 키-값, 열, 그래프 |
| 스키마 | 정적, 사전 정의 필수 | 동적, 유연함 |
| 확장성 | 수직 확장 (Scale-up) | 수평 확장 (Scale-out) |
| 트랜잭션 | ACID 보장 | BASE (최종 일관성) |
| 쿼리 언어 | SQL (표준화) | 제품마다 다름 |
| 데이터 무결성 | 강력함 | 상대적으로 약함 |
| 성능 | 복잡한 쿼리에 강함 | 단순 읽기/쓰기에 빠름 |
| 사용 사례 | 금융, ERP, 전자상거래 | 소셜미디어, IoT, 빅데이터 |
| 데이터 중복 | 최소화 (정규화) | 허용 (역정규화) |
| 조인 | 지원 | 제한적 또는 미지원 |
RDBMS를 선택해야 하는 경우
NoSQL을 선택해야 하는 경우
하이브리드 접근
SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터를 관리하기 위한 표준 프로그래밍 언어입니다. 1970년대부터 사용되어 온 SQL은 데이터 정의, 조작, 제어를 위한 강력하고 표준화된 도구입니다.
정의
SQL의 역할
SQL의 특징
1. DDL (Data Definition Language) - 데이터 정의어
2. DML (Data Manipulation Language) - 데이터 조작어
3. DCL (Data Control Language) - 데이터 제어어
4. TCL (Transaction Control Language) - 트랜잭션 제어어
CREATE - 데이터베이스 객체 생성
-- 데이터베이스 생성
CREATE DATABASE company;
-- 테이블 생성
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE,
salary DECIMAL(10, 2),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
-- 인덱스 생성
CREATE INDEX idx_last_name ON employees(last_name);
ALTER - 데이터베이스 객체 수정
-- 열 추가
ALTER TABLE employees ADD COLUMN phone VARCHAR(20);
-- 열 수정
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12, 2);
-- 열 삭제
ALTER TABLE employees DROP COLUMN phone;
-- 제약 조건 추가
ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary > 0);
DROP - 데이터베이스 객체 삭제
-- 테이블 삭제 (구조와 데이터 모두 삭제)
DROP TABLE employees;
-- 데이터베이스 삭제
DROP DATABASE company;
-- 인덱스 삭제
DROP INDEX idx_last_name ON employees;
TRUNCATE - 테이블 데이터 삭제
-- 테이블의 모든 데이터 삭제 (구조는 유지)
TRUNCATE TABLE employees;
-- DELETE보다 빠르지만 롤백 불가
SELECT - 데이터 조회
-- 기본 조회
SELECT * FROM employees;
-- 특정 열 조회
SELECT first_name, last_name, salary FROM employees;
-- 조건부 조회 (WHERE)
SELECT * FROM employees WHERE salary > 50000;
-- 정렬 (ORDER BY)
SELECT * FROM employees ORDER BY salary DESC;
-- 제한 (LIMIT)
SELECT * FROM employees LIMIT 10;
-- 집계 함수
SELECT COUNT(*) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary), MIN(salary) FROM employees;
-- 그룹화 (GROUP BY)
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- HAVING (그룹 조건)
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 60000;
INSERT - 데이터 삽입
-- 단일 행 삽입
INSERT INTO employees (first_name, last_name, email, hire_date, salary, department_id)
VALUES ('John', 'Doe', 'john.doe@company.com', '2024-01-15', 65000.00, 1);
-- 여러 행 삽입
INSERT INTO employees (first_name, last_name, email, hire_date, salary, department_id)
VALUES
('Jane', 'Smith', 'jane.smith@company.com', '2024-01-20', 70000.00, 2),
('Bob', 'Johnson', 'bob.johnson@company.com', '2024-02-01', 55000.00, 1);
-- 다른 테이블에서 데이터 복사
INSERT INTO employees_backup
SELECT * FROM employees WHERE department_id = 1;
UPDATE - 데이터 수정
-- 특정 행 수정
UPDATE employees
SET salary = 75000.00
WHERE employee_id = 1;
-- 여러 열 수정
UPDATE employees
SET salary = salary * 1.1,
email = 'new.email@company.com'
WHERE department_id = 2;
-- 조건부 수정
UPDATE employees
SET salary = salary * 1.05
WHERE hire_date < '2023-01-01';
DELETE - 데이터 삭제
-- 특정 행 삭제
DELETE FROM employees WHERE employee_id = 1;
-- 조건부 삭제
DELETE FROM employees WHERE department_id = 3;
-- 모든 행 삭제 (테이블 구조는 유지)
DELETE FROM employees;
INNER JOIN - 교집합
-- 두 테이블의 일치하는 행만 반환
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
LEFT JOIN - 왼쪽 테이블 기준
-- 왼쪽 테이블의 모든 행 + 오른쪽 테이블의 일치하는 행
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
RIGHT JOIN - 오른쪽 테이블 기준
-- 오른쪽 테이블의 모든 행 + 왼쪽 테이블의 일치하는 행
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
FULL OUTER JOIN - 합집합
-- 양쪽 테이블의 모든 행 (MySQL은 미지원, UNION으로 구현)
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
UNION
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
CROSS JOIN - 카티션 곱
-- 모든 가능한 조합
SELECT e.first_name, d.department_name
FROM employees e
CROSS JOIN departments d;
SELF JOIN - 자기 자신과 조인
-- 같은 테이블을 두 번 참조
SELECT e1.first_name AS employee, e2.first_name AS manager
FROM employees e1
INNER JOIN employees e2 ON e1.manager_id = e2.employee_id;
단일 행 서브쿼리
-- 평균 급여보다 높은 직원 조회
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
다중 행 서브쿼리
-- IN 연산자 사용
SELECT first_name, last_name
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'Seoul'
);
-- ANY/ALL 연산자
SELECT first_name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department_id = 1
);
상관 서브쿼리
-- 각 부서의 평균보다 높은 급여를 받는 직원
SELECT e1.first_name, e1.salary, e1.department_id
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
FROM 절 서브쿼리 (인라인 뷰)
SELECT dept_avg.department_id, dept_avg.avg_salary
FROM (
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
) AS dept_avg
WHERE dept_avg.avg_salary > 60000;
트랜잭션의 정의
ACID 속성
트랜잭션 제어 명령어
-- 트랜잭션 시작 (암묵적으로 시작됨)
START TRANSACTION;
-- 또는
BEGIN;
-- 작업 수행
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 2;
-- 트랜잭션 확정 (변경사항 영구 저장)
COMMIT;
-- 트랜잭션 취소 (변경사항 되돌림)
ROLLBACK;
-- 저장점 설정
SAVEPOINT savepoint1;
-- 특정 저장점으로 롤백
ROLLBACK TO savepoint1;
트랜잭션 예시
START TRANSACTION;
-- 계좌 이체 작업
UPDATE accounts
SET balance = balance - 100000
WHERE account_id = 'A001';
UPDATE accounts
SET balance = balance + 100000
WHERE account_id = 'B001';
-- 잔액 확인
SELECT balance FROM accounts WHERE account_id = 'A001';
-- 문제 없으면 확정
COMMIT;
-- 문제 있으면 취소
-- ROLLBACK;
MySQL
-- MySQL 특화 문법
SELECT * FROM employees LIMIT 10 OFFSET 20;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=InnoDB;
PostgreSQL
-- PostgreSQL 특화 문법
SELECT * FROM employees LIMIT 10 OFFSET 20;
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
metadata JSONB
);
-- CTE (Common Table Expression)
WITH dept_avg AS (
SELECT department_id, AVG(salary) as avg_sal
FROM employees
GROUP BY department_id
)
SELECT * FROM dept_avg WHERE avg_sal > 60000;
Oracle Database
-- Oracle 특화 문법
SELECT * FROM employees WHERE ROWNUM <= 10;
CREATE SEQUENCE emp_seq START WITH 1;
INSERT INTO employees (id, name)
VALUES (emp_seq.NEXTVAL, 'John');
Microsoft SQL Server
-- SQL Server 특화 문법
SELECT TOP 10 * FROM employees;
CREATE TABLE users (
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(100)
);
MariaDB
-- MariaDB는 MySQL과 거의 동일한 문법
SELECT * FROM employees LIMIT 10;