seed 데이터 vs 운영 DB: 초기 데이터 파일을 현재 DB로 착각했다
초기화 SQL(seed 데이터)은 t0 스냅샷이지 현재 DB가 아니다. 코드의 initial_data만 보고 '이 값은 없다'고 판단했다가 틀린 사례와, 마스터 데이터를 확인하는 순서.
목차
화면에 국가 코드가 NL로 그대로 노출되는 걸 국가명(Netherlands)으로 바꾸는 작업이었다. 코드에서 이름을 어디서 가져올지 정해야 했다.
후보가 셋이었다
- 다국어 파일에 있는 국가명 목록
- 국가 목록 API (DB 테이블)
- 브라우저에 내장된 기능
2번을 확인하려고 초기화 SQL 파일을 열었다.
INSERT INTO countries (name, code) VALUES
('Malaysia', 'MY'), ('Philippines', 'PH'), ... -- 6개국
6개국뿐이고 NL이 없었다. 1번 목록도 25개국인데 역시 NL이 없었다.
그래서 **"두 소스 다 NL을 못 푼다"**고 결론 내리고, 3번 브라우저 기능을 쓰는 계획을 세웠다. 코드베이스에 쓴 적 없는 기능이라 "도입 위험"까지 문서에 적었다.
그리고 이렇게 썼다.
"NL은 이 드롭다운으로 선택할 수 없는 값이니, 관리자가 수동으로 입력했거나 과거 경로로 들어온 것으로 추정된다."
추정이 틀렸다
사용자가 그 드롭다운에서 직접 골랐다.
그 드롭다운은 2번 API 응답을 그대로 그린다. 목록에 Netherlands가 떴다는 건 테이블에 NL이 실제로 있다는 뜻이다.
초기화 SQL은 처음 한 번의 스냅샷일 뿐이다. 그 뒤로 운영 데이터에 국가가 계속 추가돼 있었다.
더 나쁜 게 있다
같은 작업 앞부분에서 이미 이 점을 짚어놨었다.
"목록에 Netherlands가 떴으니 실제 DB엔 더 추가돼 있다"고 써놓고, 몇 시간 뒤 다음 작업에서 초기화 파일 기준으로 되돌아갔다.
왜 이렇게 되나
코드 저장소에 있는 데이터 파일은 이런 이름을 갖고 있다.
seed.sql
initial_data.sql
V1__init.sql
전부 **"처음"**이라는 뜻인데, 읽을 때는 "이 테이블의 내용"으로 읽힌다. 특히 그 파일 말고 다른 참고할 게 없을 때 그렇다.
남길 것
- 초기화 SQL은 t0 스냅샷이다. 현재 데이터가 아니다. 운영에서는 계속 추가된다.
- 화면에 뜬 목록이 DB의 진짜 내용이다. 드롭다운에 있으면 테이블에 있는 거다.
- "추정"이라고 적었으면 확인할 방법을 먼저 찾는다. 추정이라고 표시하는 건 정직한 거지만, 확인 가능한 걸 추정으로 남기면 그냥 안 한 거다.
- 앞에서 알아낸 걸 뒤에서 잊는다. 새 작업을 시작하면 눈앞의 코드부터 다시 보게 된다. 중요한 판단은 적어두고 다음 작업 시작할 때 다시 읽어야 한다.
더 봐야 할 것
- 운영 DB를 직접 못 보는 상황에서 마스터 데이터를 확인하는 방법
- 초기화 파일에 "이건 초기값일 뿐"이라고 적어두면 다음 사람이 덜 걸릴지