현업 사례: JSON 스키마가 갑자기 바뀌어서 새벽 3시에 전화가 온 이야기
🔥 데이터 엔지니어라면 한 번쯤 겪는 사고입니다.현업에서 가장 흔한 장애 시나리오를 살펴보겠습니다. 소스 시스템(모바일 앱, 외부 API 등)의 개발자가 JSON 스키마를 사전 공지 없이 변경 합니다. 이것이 데이터 파이프라인에 어떤 결과를 가져오는지, 어떻게 방어해야 하는지를 상세히 알아보겠습니다.
실제 장애 시나리오 타임라인
이 사고를 방지하는 방어 전략
현업에서는 “스키마가 절대 안 바뀔 거야”라는 가정은 하지 않습니다. 반드시 바뀐다고 가정하고 방어적으로 파이프라인을 설계해야 합니다.rescuedDataColumn 실전 활용 패턴
rescuedDataColumn은 단순히 “구조되지 않은 데이터를 저장하는 컬럼”이 아닙니다. 현업에서는 이 컬럼을 스키마 변경 감지 시스템 으로 활용합니다.
패턴 1: rescued_data 모니터링 알림 구축
패턴 2: rescued_data 내용 분석으로 새 필드 발견
패턴 3: rescued_data에서 복구하여 정식 컬럼으로 승격
schemaHints로 안전망 구축하기
schemaHints는 “추론이 틀려도 괜찮게” 만드는 안전장치입니다. 현업에서는 핵심 비즈니스 컬럼 에 반드시 schemaHints를 적용합니다.
실전 schemaHints 설계 원칙
schemaHints를 적용해야 하는 컬럼 유형
| 컬럼 유형 | 위험 | schemaHints 예시 |
|---|---|---|
| 금액/가격 | 정수로 추론되면 소수점 이하 유실 | "amount DECIMAL(18,4)" |
| ID 컬럼 | 숫자 ID가 나중에 UUID로 변경될 수 있음 | "order_id STRING" (가장 안전) |
| 날짜/시간 | 포맷이 일관되지 않으면 STRING으로 추론 | "created_at TIMESTAMP" |
| 전화번호 | 숫자로 추론되면 앞자리 0이 사라짐 | "phone STRING" |
| 우편번호 | 숫자로 추론되면 00123이 123이 됨 | "zip_code STRING" |
💡 20년 경험에서 나온 규칙: “이 컬럼의 타입이 잘못 추론되면 비즈니스에 영향이 있는가?” 라고 자문하세요. 답이 “예”이면 반드시 schemaHints를 적용합니다. 모든 컬럼에 힌트를 줄 필요는 없지만, 돈/시간/식별자 컬럼은 예외 없이 지정하세요.
스키마 진화 모드 선택: 실전 의사결정
현업에서 어떤schemaEvolutionMode를 써야 하는지 자주 질문을 받습니다. 정답은 소스의 성격 에 따라 다릅니다.
| 소스 유형 | 권장 모드 | 이유 |
|---|---|---|
| 자사 백엔드 API | addNewColumns | 스키마 변경을 통제할 수 있고, 새 필드 추가가 자연스러움 |
| 외부 벤더 API | rescue | 스키마 변경을 통제할 수 없으므로, 일단 받아두고 검토 |
| IoT 센서 데이터 | rescue + 모니터링 | 펌웨어 업데이트로 필드가 갑자기 바뀌는 경우가 많음 |
| 규제 대상 데이터(금융, 의료) | failOnNewColumns | 스키마 변경 시 반드시 사람이 검토해야 함 |
| 로그 데이터 | addNewColumns | 필드가 자주 추가되고, 유연성이 중요함 |
가장 안전한 프로덕션 조합 (현업 추천)
💡 현업 팁: 이 조합을 사용하면 새벽 3시에 전화받는 횟수가 대폭 줄어듭니다. 스키마가 변경되어도 파이프라인이 멈추지 않고, rescued_data 모니터링으로 다음 날 출근해서 차분하게 대응할 수 있습니다.
정리
| 핵심 개념 | 설명 |
|---|---|
| schemaLocation | 추론된 스키마를 저장하는 경로입니다. 스트림별로 고유해야 합니다 |
| inferColumnTypes | true로 설정하면 데이터를 분석하여 최적 타입을 추론합니다 |
| schemaEvolutionMode | 새 컬럼 감지 시 동작을 결정합니다 (addNewColumns, rescue, failOnNewColumns, none) |
| schemaHints | 특정 컬럼의 타입을 명시적으로 지정하여 추론을 보정합니다 |
| rescuedDataColumn | 스키마에 맞지 않는 데이터를 별도 컬럼에 보존하여 유실을 방지합니다 |