not null
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT
);
- age → NULL 허용 = 값을 넣지 않으면 NULL이 들어감
- name, email → NOT NULL = 반드시 값이 필요
INSERT INTO users (name, email, age)
VALUES ('', 'test@example.com', 0);
- 비운다 = NULL로 둔다는 의미 → NOT NULL이면 불가능
- 하지만 빈 문자열('')이나 0 같은 값은 NULL과 다름
- '' (빈 문자열) → 여전히 값이 들어간 것 → NOT NULL 컬럼에 허용
- 0 (숫자) → 값이 존재하는 것 → 허용
시간
DATE
- 형식: YYYY-MM-DD (저장 내용: 연도, 월, 일)
- 용도: 생년월일, 주문일, 등록일 등 날짜만 필요한 경우
DATETIME
- 형식: YYYY-MM-DD HH:MM:SS (저장 내용: 연도, 월, 일, 시, 분, 초)
- 용도: 주문 시각, 회원가입 시각 등 날짜 + 시간 모두 필요한 경우
TIMESTAMP
- 형식: YYYY-MM-DD HH:MM:SS (저장 내용: 연도, 월, 일, 시, 분, 초)
- 용도: 데이터가 생성되거나 수정된 시각 자동 기록할 때 많이 사용
- 내부적으로 UTC 기준 시간으로 저장 후, 조회 시 서버/클라이언트 타임존에 맞춰 변환됨
- DEFAULT CURRENT_TIMESTAMP 같이 설정하면 자동으로 현재 시간 입력 가능
- ON UPDATE CURRENT_TIMESTAMP 옵션 주면 데이터 수정 시 자동 갱신됨
TIME
- 형식: HH:MM:SS (예: 23:45:10) (저장 내용: 시, 분, 초)
- 용도: 하루 중 특정 시간(영업시간, 근무 시작/종료 시각 등)만 필요할 때
YEAR
- 형식: YYYY (예: 2025) (저장 내용: 연도만 저장)
- 용도: 자동차 출시년도, 졸업년도, 특정 연도만 필요한 경우
MySQL의 주요 특징
- 오픈소스 DBMS라서 무료로 사용 가능
- 관계형 데이터베이스 (RDBMS)
- 데이터를 테이블(행과 열) 형태로 저장
- SQL을 사용해서 데이터 관리
JOIN, GROUP BY, FOREIGN KEY 같은 관계형 기능 지원
- 다양한 스토리지 엔진 지원
- InnoDB → 트랜잭션 지원, 무결성 보장 (기본 엔진)
- MyISAM → 빠른 읽기 속도, 하지만 트랜잭션 미지원
- Memory → 메모리 기반, 속도 빠름
- 트랜잭션 & ACID 지원 (InnoDB 기준)
- 높은 호환성과 접근성
- 다양한 운영체제 (Windows, Linux, macOS)에서 사용 가능
- Python, Java, PHP, Node.js 등 여러 언어와 쉽게 연동
- 웹 서비스 (WordPress, 쇼핑몰, 게임 서버 등)에 널리 쓰임
트랜잭션(ACID) (MySQL기준)
데이터베이스에서 여러 작업(쿼리)을 하나의 논리적 단위로 묶어서 처리하는 것을 의미
- 트랜잭션은 "모두 성공(Commit)"하거나 "모두 실패(Rollback)"하는 것이 원칙
- Atomicity (원자성)
- 트랜잭션 안의 모든 쿼리는 전부 성공하거나, 전부 실패해야 함
- Consistency (일관성)
- 트랜잭션 전후로 데이터베이스 제약 조건(무결성)이 항상 유지되어야 함
- Isolation (격리성)
- 동시에 여러 트랜잭션이 실행되더라도 서로 간섭하지 않아야 함
- Durability (지속성)
- 트랜잭션이 커밋되면 DB에 영구 반영 (서버 꺼져도 유지)
무결성(Integrity)
DB 안의 데이터가 잘못된 값이나 모순된 값 없이 정확하게 유지되도록 하는 성질
- 개체 무결성 (Entity Integrity)
- 각 테이블의 행(row)을 고유하게 식별할 수 있어야 함
- 보통
PRIMARY KEY 로 보장
- PK는
NULL 불가 + 중복 불가
- 참조 무결성 (Referential Integrity) = FOREIGN KEY
- 테이블 간 관계(외래키, FK)에서 존재하지 않는 값을 참조하면 안 됨
- 부모 테이블에 없는 값은 자식 테이블이 가질 수 없음
- 도메인 무결성 (Domain Integrity)
- 컬럼이 허용된 값의 범위와 타입을 지켜야 함
- 자료형,
NOT NULL, CHECK, DEFAULT 등으로 보장
- 사용자 정의 무결성 (User-defined Integrity)
- 비즈니스 규칙에 따른 무결성
- DB 설계자가 별도로 정의
동시성 제어 (Concurrency Control)
1. Locking (잠금)
- Shared Lock (공유 잠금): 읽기는 가능, 쓰기는 불가
- Exclusive Lock (배타 잠금): 읽기/쓰기 모두 독점
2. MVCC (Multi-Version Concurrency Control)
- MySQL InnoDB, PostgreSQL에서 쓰는 방식
- 데이터를 변경할 때 기존 데이터를 복사해 두고
- 읽는 트랜잭션은 자신이 시작한 시점의 버전을 조회함 → 읽기와 쓰기 충돌 완화
3. 낙관적 / 비관적 동시성 제어
- 비관적 동시성 제어 (Pessimistic Concurrency Control)
- “동시에 접근하면 충돌 날 가능성이 크다”라고 가정 → 미리 잠금(Lock)을 걸어버림
- 한 트랜잭션이 데이터를 읽거나 수정할 때 → 다른 트랜잭션이 접근 못 하도록 막음
- 낙관적 동시성 제어 (Optimistic Concurrency Control)
- “동시에 접근해도 충돌은 드물다”라고 가정 → 잠금 안 걸고 그냥 실행
- 보통 버전 번호(
version 컬럼)나 타임스탬프를 사용해 충돌 확인
4. Deadlock (교착 상태) 관리
- 두 개 이상의 트랜잭션이 서로의 자원을 기다리며 무한 대기 상태에 빠지는 것
- InnoDB는 데드락 감지(Deadlock Detection)를 지원
- 데드락이 발생하면, InnoDB가 자동으로 한 트랜잭션을 강제로 롤백시켜서 풀어줌
MongoDB 특징
- 문서 지향 데이터베이스 (Document-Oriented)
- 테이블-행(Row) 구조 대신 컬렉션(Collection)-문서(Document) 구조 사용
- 문서는 JSON과 비슷한 BSON(Binary JSON) 형태로 저장
- 스키마가 자유로워 유연한 설계 가능
- 스키마리스 (Schema-less)
- 같은 컬렉션 안에서도 문서마다 컬럼(필드)이 달라도 저장 가능
- 데이터 구조가 자주 바뀌는 서비스에 적합 (스타트업, 로그 데이터 등)
- 수평 확장(Sharding) 지원
- 데이터를 여러 서버에 나누어 저장 → 대용량 데이터 처리에 강함
- 수직 확장(서버 업그레이드)뿐 아니라 수평 확장(Scale-out)이 자연스럽게 됨
- 고성능 (빠른 읽기/쓰기)
- 다양한 인덱스(Index) 지원
- 대규모 로그, IoT, 게임 데이터 등에서 많이 활용
- 풍부한 기능
- ReplicaSet: 데이터 복제 및 장애 복구(Failover) 지원
- Aggregation Framework: SQL의
GROUP BY와 유사한 집계 기능
- Geospatial Query: 위치 기반 검색 지원
- Flexible Indexing: 복합 인덱스, 텍스트 검색 등 제공
MongoDB 트랜잭션 (ACID)
MongoDB는 기본적으로 단일 문서(Document) 작업은 항상 ACID를 보장합니다.
또한 4.0(2018년) 이후부터 멀티 문서 트랜잭션도 지원하여, MySQL처럼 여러 컬렉션/도큐먼트에 걸쳐 ACID 보장이 가능합니다.
1. Atomicity (원자성)
- 단일 문서 연산은 항상 원자적
- 4.0+ 버전에서는 멀티 문서 트랜잭션도 가능
- 같은 문서 안의 여러 필드를 수정해도 한꺼번에 반영 → 중간 상태 없음
2. Consistency (일관성)
- 트랜잭션 종료 후에도 데이터는 항상 스키마, 제약 조건, 비즈니스 규칙을 만족해야 함
- Schema Validation(JSON Schema), 애플리케이션 로직 등을 통해 보장
3. Isolation (격리성)
- Snapshot Isolation 사용 → 중간 상태가 외부에 노출되지 않음
- 다른 트랜잭션이 커밋되더라도, 내 트랜잭션 실행 중에는 영향을 받지 않음
4. Durability (지속성)
- 한 번 커밋된 데이터는 서버가 죽더라도 보존됨
- WiredTiger 스토리지 엔진 + Write-Ahead Logging(Journal) 로 보장
writeConcern: "majority" 옵션 사용 시, 클러스터의 다수 노드에 기록된 뒤 응답 → 장애 상황에도 안전
MongoDB 무결성 (Integrity)
MongoDB도 MySQL 같은 RDBMS처럼 데이터의 정확성, 일관성, 신뢰성을 유지해야 합니다.
다만 MongoDB는 유연한 스키마를 가지므로, 무결성을 DB 자체에서 강하게 강제하지 않고
주로 애플리케이션 로직 / Schema Validation으로 보장합니다.
1. 개체 무결성 (Entity Integrity)
- 각 문서(Document)는 반드시 고유하게 식별되어야 함
- MongoDB는 자동으로
_id 필드를 기본 PK로 부여 (ObjectId)
2. 참조 무결성 (Referential Integrity)
- RDBMS에서는
FOREIGN KEY 제약으로 보장
- MongoDB는 FK 제약이 없음 → 대신 두 가지 방식 활용
- 내장 문서(Embedding): 부모 문서 안에 자식 데이터를 포함 → 일관성 쉽게 유지
- 참조(Reference): 다른 컬렉션의
_id를 저장 후, $lookup으로 조인
3. 도메인 무결성 (Domain Integrity)
- 컬럼(필드)의 데이터 타입과 값의 범위를 지켜야 함
- MongoDB는 Schema Validation (
$jsonSchema)으로 제약 설정 가능
4. 사용자 정의 무결성 (User-defined Integrity)
- 비즈니스 규칙에 따른 무결성
- 보통 애플리케이션 로직 + 트랜잭션으로 구현
MongoDB 동시성 제어
여러 클라이언트가 동시에 MongoDB에 접근할 때,
데이터의 일관성과 무결성을 유지하기 위해 사용하는 제어 기법.
MongoDB는 MVCC(Multi-Version Concurrency Control) + Lock을 혼합해서 동시성을 관리합니다.
1. Locking (잠금)
- Document-level Lock (문서 단위 잠금) 으로 동작
- 같은 컬렉션이라도 다른 문서는 동시에 수정 가능
2. MVCC (Multi-Version Concurrency Control)
- 읽기(READ)는 쓰기(WRITE)에 막히지 않도록 스냅샷 기반 읽기(Snapshot Read) 제공
- 트랜잭션이 시작되면 그 시점의 데이터를 읽고,
다른 트랜잭션이 COMMIT해도 내 트랜잭션 안에서는 영향 없음 → 일관된 View 보장
3. 낙관적 / 비관적 제어
- 비관적 제어 (Pessimistic Lock): MongoDB는 기본적으로 제공하지 않음
- 낙관적 제어 (Optimistic Concurrency Control):
version 필드나 _id 기준으로 충돌 감지 후 롤백 처리
4. 데드락 (Deadlock)
- MongoDB는 문서 단위 락을 사용하기 때문에,
같은 문서를 여러 트랜잭션이 동시에 수정하면 충돌 발생 가능 → 데드락 위험 존재
- MySQL InnoDB 처럼 내부적으로 충돌 감지 시 한 트랜잭션을 중단
- MongoDB 전략: " 데드락 해소 = 실패 반환 + 재시도 "