웹 개발
배포 후 데이터가 초기화되는 문제 추적하기
개발할 때는 잘 저장되던 데이터가 배포 후 사라질 때 체계적으로 원인을 찾는 방법.
배포 후 데이터가 사라지는 건 개발자에게 악몽이다. 로컬에서는 완벽한데, 배포 환경에서만 일어난다. 이런 문제는 대부분 빌드 과정이나 배포 설정에서 비롯된다.
핵심 질문들
먼저 명확히 해야 할 것들:
- 언제 데이터가 사라지는가? (배포 직후? 몇 시간 후? 일정 시간마다?)
- 어느 데이터가 사라지는가? (모든 데이터? 특정 사용자만? 특정 필드만?)
- 어디에 저장되는 데이터인가? (DB? 캐시? 파일 시스템? 환경변수?)
- 배포 전과 후로 환경이 뭐가 다른가? (버전? 설정? 권한?)
배포 환경의 임시 스토리지 확인
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가 비어있으면 앱도 빈 상태가 된다.
체계적인 추적 순서
- 로그 확인: 배포 후 에러가 있는가? 데이터 저장 시도가 기록되는가?
- 환경 변수 확인: DATABASE_URL, 스토리지 경로, 캐시 서버가 배포 환경에서 제대로 설정됐는가?
- 파일 시스템 확인: 로컬 파일에 의존하는 코드가 있는가? 컨테이너 재시작 시 사라질 데이터인가?
- DB 마이그레이션 확인: 배포 후 마이그레이션이 실행됐는가? 테이블이 존재하는가?
- 권한 확인: 앱 프로세스가 파일을 쓸 수 있는가? DB 사용자가 필요한 권한을 가지고 있는가?
- 설정 값 비교: 로컬과 배포 환경의 설정을 나열해서 한 줄 한 줄 비교
데이터 손실은 심각한 문제다. 작은 확인들을 기록해두면, 비슷한 문제가 다시 나올 때 훨씬 빠르게 대응할 수 있다.