seed 데이터 vs 운영 DB: 초기 데이터 파일을 현재 DB로 착각했다

초기화 SQL(seed 데이터)은 t0 스냅샷이지 현재 DB가 아니다. 코드의 initial_data만 보고 '이 값은 없다'고 판단했다가 틀린 사례와, 마스터 데이터를 확인하는 순서.

조회
목차

화면에 국가 코드가 NL로 그대로 노출되는 걸 국가명(Netherlands)으로 바꾸는 작업이었다. 코드에서 이름을 어디서 가져올지 정해야 했다.

후보가 셋이었다

  1. 다국어 파일에 있는 국가명 목록
  2. 국가 목록 API (DB 테이블)
  3. 브라우저에 내장된 기능

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를 직접 못 보는 상황에서 마스터 데이터를 확인하는 방법
  • 초기화 파일에 "이건 초기값일 뿐"이라고 적어두면 다음 사람이 덜 걸릴지

사이트 내 검색

제목·태그·설명·본문으로 발행 글을 찾습니다