노트

스키마 드리프트

Schema Drift

백엔드#db · 연결된 개념 7개

쉽게 말하면

스키마 드리프트는 집을 고쳤는데 설계 도면은 그대로 둬서 도면과 실제 집이 조금씩 달라지는 거예요. 도면만 믿고 벽을 뚫으면 사고가 나듯, 코드가 믿는 구조와 실제 DB가 어긋나 실행 중에 깨져요.

비유가 깨지는 곳 집은 한 채지만 실제로는 모델, 마이그레이션, 생성 타입, 환경별 DB처럼 맞춰야 할 사본이 여럿이에요. 그래서 변경을 한 커밋에 세트로 넣고 CI에서 makemigrations --check로 어긋남을 잡아요.

스키마 드리프트(schema drift)는 "있어야 할 스키마의 정의"와 "실제 스키마"가 조금씩 어긋나는 현상이다. 한쪽이 바뀌었는데 다른 쪽이 따라가지 못해 생긴다. 기준선에서 서서히 떠내려간다는 뉘앙스로 drift라는 말을 쓴다.

대표적인 세 맥락

  • 모델 ↔ 마이그레이션: ORM(Object-Relational Mapping) 모델을 고치고 마이그레이션을 만들지 않았거나, 누군가 DB에 직접 ALTER TABLE을 쳐서 마이그레이션 기록과 실제 테이블이 달라진다
  • 백엔드 모델 ↔ 프론트엔드 생성 타입: 백엔드 스키마에서 TypeScript 타입을 생성하는 구조에서, 모델만 바꾸고 타입을 다시 생성하지 않으면 응답 형태와 프론트엔드의 기대가 어긋난다. 타입 검사는 통과하는데 런타임에서 깨진다
  • 환경 간: 운영·QA·로컬 DB의 스키마가 서로 달라진다. 운영에만 적용된 마이그레이션이 로컬에 없는 경우

막는 방법

  • 모델 변경, 마이그레이션 파일, 생성된 타입을 한 커밋에 세트로 넣는다(원자적 커밋)
  • CI에서 드리프트를 검사한다. Django는 manage.py makemigrations --check가 모델과 마이그레이션의 차이를 찾으면 실패한다. 생성 타입도 CI에서 다시 생성해 diff가 없는지 본다
  • DB를 손으로 고치지 않는다. 모든 변경은 마이그레이션으로
  • 스키마 변경은 확장 → 이전 → 축소(expand-migrate-contract) 순서로 나눠 배포해 구버전·신버전이 공존하게 한다(병렬 수정 (팽창-수축))
python manage.py makemigrations --check --dry-run

인프라 설정이 기록과 어긋나는 같은 현상을 설정 드리프트(configuration drift)라고 하고, GitOps가 이를 막는다. 타입이 런타임 데이터와 맞는지 경계에서 검증하는 일은 타입 추론과 타입 검사과 이어진다. 컬럼 구조와 제약 조건도 같은 방식으로 관리한다.

출처: Django 문서: makemigrations --check

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 전략 패턴

    같은 목적을 가진 여러 알고리즘을 각각 별도 객체(또는 함수)로 빼고, 실행할 때 그중 하나를 골라 끼우는 패턴. 호출하는 쪽은 공통 인터페이스만 안다.

  • 업스트림과 다운스트림

    흐름의 방향을 강물에 빗댄 말이다. 다만 무엇의 흐름을 기준으로 하느냐에 따라 방향이 반대로 쓰인다. 서비스 간 호출을 말할 때는 요청이 흘러가는 쪽을 기준으로 다운스트림 = 내가 호출하는 쪽, 업스트림 = 나를 호출하는 쪽이라 부르는 경우가 많다. 아래 설명은 이 용법을 따른다.

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • 행동 패턴

    객체 사이의 책임 분배와 대화 방식을 정리하는 패턴들. 요청 전달, 알고리즘 교체, 상태 변화, 알림, 작업 캡슐화 같은 문제를 다룬다.

  • 마우스 드래그 가로 스크롤

    터치 기기에서는 손가락으로 밀면 되는 가로 슬라이드를, 데스크톱에서는 마우스로 잡아끌어 스크롤하게 만드는 패턴. mousedown만으로 만들면 끌다가 안쪽 글자나 이미지가 선택되거나 링크가 눌리는 문제가 생긴다.

보기 옵션