AI가 짠 마이그레이션 파일 리뷰하기
AI가 무심코 작성한 파괴적인 마이그레이션 코드를 리뷰할 때 놓치면 안 되는 3가지 핵심 체크리스트를 점검합니다.
바이브코딩(Vibe Coding) 시대에는 복잡한 SQL 쿼리나 마이그레이션 스크립트 작성조차 AI의 도움을 받으면 순식간에 끝납니다. "전화번호 컬럼 이름을 contact_number로 바꿔줘"라고 요청하면, AI는 즉시 완벽한 문법의 마이그레이션 파일을 뱉어냅니다. 하지만 AI는 종종 '가장 빠르고 간결한' 정답을 제시할 뿐, '운영 환경의 안정성'까지 고려하지는 못합니다. 이번 시간에는 AI가 작성한 마이그레이션 코드를 운영 서버에 반영하기 전, 인간이 반드시 확인해야 할 필수 체크리스트를 알아봅니다.
AI의 최적화가 불러오는 함정
AI 코딩 어시스턴트(Cursor, Copilot 등)에게 데이터베이스 스키마 변경을 요청하면, 대개 교과서적이고 직접적인 쿼리를 작성해 줍니다. 개발 환경에서는 아무 문제가 없지만, 이 코드를 그대로 Production(운영)에 푸시하는 순간 대참사가 발생할 수 있습니다.
우리는 앞서 파괴적 변경(Destructive Change)이 얼마나 위험한지, 무중단 배포를 위해 5단계 우회로가 왜 필요한지 배웠습니다. 따라서 AI가 짜준 코드가 우리의 운영 원칙을 위배하지 않는지 매의 눈으로 심사해야 합니다.
AI 마이그레이션 리뷰 3대 체크리스트
- 1. 파괴적인 명령어(DROP, RENAME, ALTER TYPE)가 포함되어 있는가?
- 2. 구버전 애플리케이션과의 하위 호환성을 깨뜨리는가?
- 3. 테이블 전체에 과도한 잠금(Lock)을 유발하는가?
이 세 가지 항목을 하나씩 자세히 뜯어보겠습니다.
체크리스트 1: 파괴적인 명령어가 있는가?
리뷰할 때 가장 먼저 찾아야 하는 단어는 `DROP`, `RENAME`, 그리고 데이터 타입을 직접 변경하는 `ALTER ... TYPE` 구문입니다.
위험한 AI 코드의 예시
상황: 사용자 테이블의 이메일 컬럼 길이를 늘리고 이름을 바꾸고 싶음. AI가 짜준 up.sql:
ALTER TABLE users RENAME COLUMN user_email TO email_address;
ALTER TABLE users ALTER COLUMN email_address TYPE VARCHAR(255);
DROP COLUMN old_legacy_field;위 스크립트를 보고 "문법이 완벽하군" 하고 승인(Approve)한다면, 배포되는 순간 에러 폭풍을 맞이하게 됩니다.
- RENAME과 DROP: 즉시 구버전 애플리케이션의 쿼리를 고장 냅니다.
- ALTER TYPE: 데이터 타입을 변경하는 작업은 테이블 내부적으로 데이터를 재기록해야 하는 경우가 많아, 오랫동안 테이블 전체에 쓰기 잠금(Lock)을 걸 수 있습니다.
대응 방법: 이런 파괴적 쿼리를 발견했다면, AI에게 "운영 환경이므로 다운타임이 발생하면 안 돼. Expand and Contract 패턴을 써서 새로운 컬럼을 추가하는 방식으로 다시 짜줘"라고 명확히 재요청해야 합니다.
체크리스트 2: 하위 호환성을 유지하는가?
파괴적인 명령어가 없더라도 안심할 수 없습니다. 단순히 컬럼을 새로 추가(`ADD COLUMN`)하는 스크립트라도, 기존 시스템을 고장 낼 수 있는 지뢰가 숨어 있습니다.
가장 대표적인 지뢰가 바로 `NOT NULL` 제약조건과 기본값(Default) 누락입니다.
하위 호환성을 깨는 은밀한 코드
오해 또는 실수
새 컬럼에 NOT NULL 추가
바로잡기
구버전 앱은 새 컬럼에 값을 넣지 않으므로 100% INSERT 에러 발생
오해 또는 실수
DEFAULT 값 없이 NOT NULL 강제
바로잡기
위와 동일한 이유로 레코드 생성 불가
오해 또는 실수
기존 제약조건의 급격한 강화
바로잡기
갑자기 UNIQUE 인덱스를 걸면, 기존 중복 데이터 때문에 마이그레이션 스크립트 자체가 실패하여 서버 부팅 불가
대응 방법: 추가되는 컬럼에 `NULL`이 허용되어 있는지, 혹은 앱이 데이터를 넣지 않아도 괜찮도록 `DEFAULT` 값이 안전하게 설정되어 있는지 확인하세요.
체크리스트 3: 과도한 잠금(Lock)을 유발하는가?
마이그레이션이 서비스 장애를 일으키는 또 다른 원인은 바로 성능 문제입니다. 데이터가 1,000만 건 있는 테이블에 무심코 인덱스를 생성하면, 데이터베이스는 인덱스를 굽는 몇 분(혹은 몇 시간) 동안 해당 테이블의 삽입/수정 작업을 모두 차단해 버립니다.
-- AI가 제안한 흔한 인덱스 생성 (위험!)
CREATE INDEX idx_users_email ON users(email);이 쿼리가 실행되는 동안 사용자는 회원가입을 할 수도, 프로필을 수정할 수도 없습니다. 타임아웃 에러가 폭주하게 됩니다.
대응 방법: PostgreSQL 같은 현대적인 데이터베이스는 잠금을 최소화하며 백그라운드에서 인덱스를 생성하는 기능을 제공합니다. AI에게 "인덱스 생성 시 테이블 Lock을 걸지 않도록 CONCURRENTLY 옵션을 사용해줘"라고 지시해야 합니다.
-- 안전한 인덱스 생성 방식 (PostgreSQL 예시)
CREATE INDEX CONCURRENTLY idx_users_email ON users(email);바이브코딩 시대의 인간의 역할
코드를 타이핑하는 일은 기계가 훨씬 빠르고 정확하게 해냅니다. 하지만 그 코드가 비즈니스 환경과 인프라의 맥락 속에서 어떤 파급 효과를 낼지 상상하고 차단하는 것은 여전히 시스템을 책임지는 사람의 몫입니다.
AI를 유능하지만 현장 경험이 부족한 주니어 개발자라고 생각해 보세요. 마이그레이션 파일의 리뷰 버튼을 누르기 전, 머릿속으로 "이 스크립트가 실행될 때, 아직 업데이트되지 않은 어제 버전의 앱이 동시에 돌고 있다면 무슨 일이 벌어질까?"라는 질문을 꼭 한 번 던져보시기 바랍니다.
예시
-- 예시
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.AI가 작성한 마이그레이션 스크립트에 '새로운 컬럼을 NOT NULL 제약조건과 함께 추가'하는 코드가 포함되어 있습니다. 이를 운영 환경에 배포하면 어떤 문제가 발생하나요?
3줄 요약
- 1마이그레이션 리뷰 시 DROP, RENAME, ALTER TYPE 같은 파괴적인 구문이 있는지 최우선으로 검사하세요.
- 2새로 추가되는 컬럼이나 제약조건이 구버전 애플리케이션의 하위 호환성을 깨뜨리지 않는지(예: 무리한 NOT NULL 추가) 확인하세요.
- 3테이블 전체에 오랫동안 Lock을 거는 작업(단순 인덱스 생성 등)은 피하고, Concurrently 같은 비동기 방식을 요구하세요.