lifecarelog
개발일지

마이그레이션이 안 먹힌 이유, 셸에 DB URL이 없었다

대화형 셸에 DB URL이 없어 마이그레이션이 미적용으로 끝나던 문제를, 적용 스크립트를 세 번 고치며 잡은 1인 개발 빌드로그예요.

6분 읽기

지난 7일 커밋 14건을 돌아보니, 9월 20일 저녁 스크립트 하나에만 커밋이 3개 붙어 있더라고요. 라이프케어로그 마케팅 자동화 쪽 DB 마이그레이션 적용 스크립트예요. 20시 11분에 첫 커밋, 21시 32분에 세 번째 커밋. 그 사이에 뭘 헤맸는지 그대로 적어 둘게요.

마이그레이션이 "적용됐다"고 믿고 있었어요

플랜씨·플랜엘 같은 서비스를 혼자 만들다 보면 인프라 쪽은 늘 뒷전이에요. 마이그레이션 파일은 커밋해 두고, 터미널에서 적용 명령 한 번 치면 끝이라고 생각했죠.

그런데 직접 돌려 보니 명령은 조용히 끝나는데 DB엔 아무 변화가 없었어요. 원인은 단순했어요. 스크립트는 셸 환경변수에서 DB URL을 기대했는데, 제가 손으로 여는 터미널엔 그 값이 없었던 거예요. 에러도 없이 끝나는 게 더 문제였어요. 실패했는데 성공처럼 보이는 상태요.

첫 커밋: 셸 대신 파일에서 읽자 (20:11)

그래서 적용 스크립트를 따로 만들었어요. 셸 환경에 기대지 않고 설정 파일에서 DB URL을 읽어 오는 구조예요. 직접 만들어 보니 뼈대는 단순했고, 이걸로 끝인 줄 알았어요.

두 번째 커밋: 설정 파일이 두 곳이었어요 (20:23)

적용해 봤더니 이번엔 "설정을 못 찾았다"고 나오더라고요. 설정 파일이 놓일 수 있는 자리가 두 곳인데 스크립트는 한 곳만 보고 있었어요. 두 곳을 순서대로 읽게 바꾸고, 그래도 못 찾으면 후보 변수명을 화면에 보여 주게 했어요. 다음에 같은 벽에 부딪혔을 때 "어떤 이름으로 넣어야 하지"부터 다시 찾지 않으려고요.

세 번째 커밋: 변수는 있는데 비어 보였어요 (21:32)

가장 오래 잡아먹은 건 마지막이에요. 파일을 열면 값이 분명히 있는데, 스크립트 안에서는 빈 문자열이었어요.

읽는 방식이 문제였어요. 처음엔 설정 파일을 source로 통째로 실행했는데, 그건 파일을 셸 스크립트로 취급하는 거라 따옴표나 특수문자, export 접두어를 셸이 어떻게 해석하느냐에 결과가 갈려요. 그래서 셸에 해석을 맡기지 않고 필요한 줄만 직접 뽑는 방식으로 바꿨어요. 대략 이런 모양이에요.

# 설정 파일에서 특정 키의 값만 직접 추출 (개념 예시)
val=$(grep -E '^(export )?DB_URL=' "$cfg" | head -n 1 | cut -d= -f2- | tr -d '"')

테스트해 보면 이쪽이 훨씬 예측 가능해요. 파일에 뭐가 적혀 있든 정규식에 걸린 줄 하나만 보니까요.

셸 변수 의존파일에서 읽기파일 두 곳 순회값을 직접 추출

같은 날 launchd 잡도 죽어 있었어요

덤으로 하나 더. 같은 저녁에 무인 잡들이 멈춰 있는 걸 발견했어요. Xcode 라이선스 게이트가 시스템 파이썬 실행을 막고 있었고, plist 5개에 DEVELOPER_DIR을 고정해서 풀었어요. 마이그레이션 문제와 원인은 다르지만 결은 같아요. 환경이 조용히 바뀌면 스크립트는 조용히 죽어요.

남는 것

세 번 고치고 나서 정한 원칙이에요.

  • 셸 환경 믿지 않기
  • 못 찾으면 후보 이름 보여 주기
  • source 대신 직접 추출

혼자 만들다 보면 "내 터미널에서 되니까 됐다"로 넘어가기 쉬운데, 그 터미널이 유일한 환경이 아니에요. 그래서 그날 밤 23시엔 적용 전에 돌리는 읽기 전용 검증 스크립트까지 하나 더 붙였어요. 적용 스크립트가 잘 돌았는지를 스크립트 자신이 아니라 다른 눈으로 확인하려고요.

#마이그레이션#셸스크립트#1인개발

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글

댓글

아직 댓글이 없어요. 첫 댓글을 남겨주세요.