← 전체 글로 돌아가기

웹 개발

배포 후 데이터가 초기화되는 문제 추적하기

개발할 때는 잘 저장되던 데이터가 배포 후 사라질 때 체계적으로 원인을 찾는 방법.

배포 후 데이터가 사라지는 건 개발자에게 악몽이다. 로컬에서는 완벽한데, 배포 환경에서만 일어난다. 이런 문제는 대부분 빌드 과정이나 배포 설정에서 비롯된다.

핵심 질문들

먼저 명확히 해야 할 것들:

  1. 언제 데이터가 사라지는가? (배포 직후? 몇 시간 후? 일정 시간마다?)
  2. 어느 데이터가 사라지는가? (모든 데이터? 특정 사용자만? 특정 필드만?)
  3. 어디에 저장되는 데이터인가? (DB? 캐시? 파일 시스템? 환경변수?)
  4. 배포 전과 후로 환경이 뭐가 다른가? (버전? 설정? 권한?)

배포 환경의 임시 스토리지 확인

Docker 컨테이너는 상태를 유지하지 않는다. 만약 로컬 파일에 데이터를 저장하면, 배포 후 컨테이너가 재시작될 때 사라진다.

# 컨테이너 내 파일 시스템 확인
docker exec container-name ls -la /app/uploads/

컨테이너를 다시 시작하면 이 파일들은 모두 사라진다. 대신 S3, GCS 같은 영구 스토리지를 써야 한다.

데이터베이스 설정 문제

배포 환경의 DATABASE_URL이 다를 수 있다. 로컬에서는 localhost:5432지만, 배포 후에는 다른 서버를 가리킨다.

echo $DATABASE_URL  # 배포 환경에서 확인

혹은 배포할 때 마이그레이션이 실행되지 않아서, 새 테이블이 없는 상태에서 앱이 데이터를 저장하려고 시도할 수도 있다.

빌드 과정에서 데이터 삭제

빌드 스크립트에서 실수로 데이터를 지울 수 있다.

# 배포 전 실행 스크립트 확인
cat package.json  # "build" 스크립트 확인

Make sure npm run build가 DB를 drop하지는 않는다. 혹은 seed 데이터만 생각하고 기존 데이터를 무시한다거나.

환경 차이가 가리는 문제

배포 환경에서는 권한이 다를 수 있다. 앱이 파일을 쓸 권한이 없거나, DB 사용자가 특정 테이블에 대한 INSERT 권한이 없을 수 있다.

# 파일 권한 확인
ls -la /app/data/
chmod 755 /app/data/

# DB 권한 확인
SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='users';

캐시 문제

Redis나 Memcached를 쓸 때, 배포 후 캐시 키가 바뀌거나 캐시가 초기화될 수 있다.

redis-cli KEYS "*"  # 캐시에 뭐가 있는지 확인
redis-cli FLUSHDB  # 캐시 초기화 (테스트용)

캐시가 비워지면서 DB에서 데이터를 다시 로드해야 하는데, DB가 비어있으면 앱도 빈 상태가 된다.

체계적인 추적 순서

  1. 로그 확인: 배포 후 에러가 있는가? 데이터 저장 시도가 기록되는가?
  2. 환경 변수 확인: DATABASE_URL, 스토리지 경로, 캐시 서버가 배포 환경에서 제대로 설정됐는가?
  3. 파일 시스템 확인: 로컬 파일에 의존하는 코드가 있는가? 컨테이너 재시작 시 사라질 데이터인가?
  4. DB 마이그레이션 확인: 배포 후 마이그레이션이 실행됐는가? 테이블이 존재하는가?
  5. 권한 확인: 앱 프로세스가 파일을 쓸 수 있는가? DB 사용자가 필요한 권한을 가지고 있는가?
  6. 설정 값 비교: 로컬과 배포 환경의 설정을 나열해서 한 줄 한 줄 비교

데이터 손실은 심각한 문제다. 작은 확인들을 기록해두면, 비슷한 문제가 다시 나올 때 훨씬 빠르게 대응할 수 있다.