데이터베이스(Database)는 데이터를 구조화된 형태로 저장하고, 효율적으로 관리할 수 있게 도와주는 시스템.
쉽게 말하면, "정보를 담는 잘 정리된 엑셀 파일"이라고 생각하면 된다.
SQL(Structured Query Language)은 데이터베이스에 명령을 내리는 언어이다.
| 구문 | 설명 |
|---|---|
| SELECT | 데이터 조회 |
| INSERT | 데이터 추가 |
| UPDATE | 데이터 수정 |
| DELETE | 데이터 삭제 |
| WHERE | 조건 지정 |
| JOIN | 테이블 간 연결 |
예시:
SELECT * FROM users WHERE age > 20;
테이블에서 각 행을 유일하게 식별하는 컬럼
중복 X, NULL X
다른 테이블의 기본 키를 참조하는 컬럼
테이블 간 관계(1:1, 1:N 등)를 표현
데이터 중복을 줄이고, 데이터 무결성을 높이기 위한 테이블 분리 작업
여러 단계 (1NF, 2NF, 3NF 등) 존재
NoSQL(Not Only SQL)은 관계형 DB가 아닌 데이터베이스입니다.
테이블 대신 문서(Document), 키-값(Key-Value) 등 다양한 구조 사용
유연한 스키마, 높은 확장성
MongoDB (문서 기반)
Redis (키-값 저장소)
Firebase (JSON 기반)
트랜잭션이 지켜야 할 4가지 성질
| 속성 | 설명 |
|---|---|
| A - Atomicity (원자성) | 모두 성공하거나 모두 실패해야 함 |
| C - Consistency (일관성) | 트랜잭션 전후의 데이터는 일관되어야 함 |
| I - Isolation (격리성) | 동시에 실행되는 트랜잭션이 서로 간섭하지 않음 |
| D - Durability (지속성) | 트랜잭션이 완료되면 그 결과는 영구적으로 저장 |
예: 은행 이체 시, 출금과 입금은 동시에 성공하거나 동시에 실패해야 함 (원자성)
A에서 B로 이체할 시 A에선 출금이 되고 B에서는 입금이 동시에 성공해야한다는 뜻. 만약 한 곳에서라도 실패한다면 트랜잭션을 롤백한다.
-- 인덱스 생성 예시
CREATE INDEX idx_name ON users(name);
두 테이블에서 일치하는 값이 있는 행만 반환
기준 테이블의 모든 행 + 조건에 맞는 행만 합쳐서 반환
모든 행 반환, 조건이 없는 경우 NULL로 채움
-- INNER JOIN 예시
SELECT users.name, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;
복잡한 쿼리를 단순한 테이블처럼 사용할 수 있도록 만든 가상의 테이블
실제 데이터를 저장하지 않고, 정의된 쿼리 결과를 보여줌
CREATE VIEW active_users AS
SELECT * FROM users WHERE is_active = true;
| 구분 | 정규화 | 비정규화 |
|---|---|---|
| 장점 | 중복 최소화, 일관성 유지 | 조회 성능 향상 |
| 단점 | JOIN이 많아져 성능 저하 가능 | 데이터 중복 증가 |
| 사용 예시 | 대부분의 OLTP 시스템 | 조회 위주의 서비스 (OLAP 등) |
| 항목 | RDB | NoSQL |
|---|---|---|
| 구조 | 정해진 스키마, 테이블 | 유연한 스키마, 문서/키-값 등 |
| 확장 | 수직 확장 (Scale-Up) | 수평 확장 (Scale-Out) |
| 트랜잭션 | 강력한 지원 | 일부 지원 |
| 사용처 | 복잡한 관계, 정합성 중요 | 빠른 읽기/쓰기, 유연한 구조 |