2025/09/08 Database -5

김기훈·2025년 9월 8일

TIL

목록 보기
15/194

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의 주요 특징

  1. 오픈소스 DBMS라서 무료로 사용 가능
  2. 관계형 데이터베이스 (RDBMS)
    • 데이터를 테이블(행과 열) 형태로 저장
    • SQL을 사용해서 데이터 관리
    • JOIN, GROUP BY, FOREIGN KEY 같은 관계형 기능 지원
  3. 다양한 스토리지 엔진 지원
    • InnoDB → 트랜잭션 지원, 무결성 보장 (기본 엔진)
    • MyISAM → 빠른 읽기 속도, 하지만 트랜잭션 미지원
    • Memory → 메모리 기반, 속도 빠름
  4. 트랜잭션 & ACID 지원 (InnoDB 기준)
  5. 높은 호환성접근성
    • 다양한 운영체제 (Windows, Linux, macOS)에서 사용 가능
    • Python, Java, PHP, Node.js 등 여러 언어와 쉽게 연동
    • 웹 서비스 (WordPress, 쇼핑몰, 게임 서버 등)에 널리 쓰임

트랜잭션(ACID) (MySQL기준)

데이터베이스에서 여러 작업(쿼리)을 하나의 논리적 단위로 묶어서 처리하는 것을 의미

  • 트랜잭션은 "모두 성공(Commit)"하거나 "모두 실패(Rollback)"하는 것이 원칙
  1. Atomicity (원자성)
  • 트랜잭션 안의 모든 쿼리는 전부 성공하거나, 전부 실패해야 함
  1. Consistency (일관성)
  • 트랜잭션 전후로 데이터베이스 제약 조건(무결성)이 항상 유지되어야 함
  1. Isolation (격리성)
  • 동시에 여러 트랜잭션이 실행되더라도 서로 간섭하지 않아야 함
  1. Durability (지속성)
  • 트랜잭션이 커밋되면 DB에 영구 반영 (서버 꺼져도 유지)

무결성(Integrity)

DB 안의 데이터가 잘못된 값이나 모순된 값 없이 정확하게 유지되도록 하는 성질

  1. 개체 무결성 (Entity Integrity)
    • 각 테이블의 행(row)을 고유하게 식별할 수 있어야 함
    • 보통 PRIMARY KEY 로 보장
    • PK는 NULL 불가 + 중복 불가
  2. 참조 무결성 (Referential Integrity) = FOREIGN KEY
    • 테이블 간 관계(외래키, FK)에서 존재하지 않는 값을 참조하면 안 됨
    • 부모 테이블에 없는 값은 자식 테이블이 가질 수 없음
  3. 도메인 무결성 (Domain Integrity)
    • 컬럼이 허용된 값의 범위와 타입을 지켜야 함
    • 자료형, NOT NULL, CHECK, DEFAULT 등으로 보장
  4. 사용자 정의 무결성 (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 특징

  1. 문서 지향 데이터베이스 (Document-Oriented)
    • 테이블-행(Row) 구조 대신 컬렉션(Collection)-문서(Document) 구조 사용
    • 문서는 JSON과 비슷한 BSON(Binary JSON) 형태로 저장
    • 스키마가 자유로워 유연한 설계 가능
  2. 스키마리스 (Schema-less)
    • 같은 컬렉션 안에서도 문서마다 컬럼(필드)이 달라도 저장 가능
    • 데이터 구조가 자주 바뀌는 서비스에 적합 (스타트업, 로그 데이터 등)
  3. 수평 확장(Sharding) 지원
    • 데이터를 여러 서버에 나누어 저장 → 대용량 데이터 처리에 강함
    • 수직 확장(서버 업그레이드)뿐 아니라 수평 확장(Scale-out)이 자연스럽게 됨
  4. 고성능 (빠른 읽기/쓰기)
    • 다양한 인덱스(Index) 지원
    • 대규모 로그, IoT, 게임 데이터 등에서 많이 활용
  5. 풍부한 기능
    • 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 전략: " 데드락 해소 = 실패 반환 + 재시도 "
profile
안녕하세요.

0개의 댓글