← 전체 글로 돌아가기

웹 개발

운영 중 상태가 꼬였을 때 초기화하는 법

배포 후 데이터나 캐시 상태가 이상할 때 안전하게 리셋하고 원인을 찾는 방법.

Next.js 프로젝트를 운영하다 보면 배포 후 상태가 꼬이는 경험을 한다. 사용자가 "최신 내용이 안 보여요"라고 하거나, "아까는 된 기능이 지금 안 돼요"라고 말한다.

문제의 경계를 먼저 그어라

"상태가 꼬였다"는 것이 구체적으로 뭔지 파악해야 한다.

  • 화면에 표시되는 데이터가 틀렸나?
  • 기능 자체가 작동 안 하나?
  • 데이터베이스 상태는 맞은데 화면만 틀렸나?
  • 캐시 때문인가?

이 4가지를 먼저 구분한다.

첫 번째: 로그 확인

# 빌드 로그 확인
npm run build  # 에러 없나?

# 배포 후 로그
sudo journalctl -u nextjs-app -n 50

# 에러가 있었나?
sudo journalctl -u nextjs-app | grep -i error

로그가 가장 정직한 증거다. 화면에 뭔가 보이지 않아도 로그에는 이유가 남아있을 가능성이 높다.

두 번째: 공개 URL에서 확인

curl -s https://example.com | grep -Ei 'title|description|og:'

HTML 메타데이터를 직접 확인한다. 빌드가 제대로 되었는지 알 수 있다.

캐시 문제인지 확인

Next.js는 여러 곳에서 캐싱한다.

# 1. 빌드 캐시
rm -rf .next
npm run build

# 2. CDN 캐시 (있다면)
# Cloudflare나 다른 CDN 대시보드에서 캐시 비우기

# 3. 브라우저 캐시
# Incognito 모드에서 테스트
curl -s https://example.com | head

데이터베이스 상태 확인

# 마이그레이션이 제대로 됐나?
npm run migrate

# 특정 테이블의 데이터
psql -U username -d dbname -c "SELECT COUNT(*) FROM users;"

# 최근 수정된 데이터
psql -U username -d dbname -c "SELECT * FROM users ORDER BY updated_at DESC LIMIT 5;"

canonical과 정적 생성 확인

# 페이지가 정적으로 생성되었나?
ls -la .next/server/pages/

# ISR이 제대로 설정되었나?
# next.config.js에서:
// revalidate: 60  # 60초마다 갱신

만약 revalidate가 없거나 너무 길면, 오래된 데이터를 보여준다.

환경 변수 확인

# 배포 환경의 변수가 맞나?
echo $NEXT_PUBLIC_API_URL
echo $DATABASE_URL  # 이건 로그에 노출되면 안 됨

# 로컬과 비교
cat .env.local  # 로컬
# vs
# 배포 환경의 설정

데이터베이스 URL이 달라도 조용히 실패한다.

안전하게 초기화하기

1단계: 현재 상태 백업

# 데이터 백업
pg_dump -U username dbname > backup-$(date +%Y%m%d-%H%M%S).sql

2단계: 한 가지씩만 시도

# 캐시만 비우기
rm -rf .next
npm run build  # 재빌드

# 다시 배포
redeploy

# 테스트
curl -s https://example.com | grep 'title'

결과가 변했나?

  • 변했다면 원인은 캐시였다
  • 안 변했다면 다음 시도

3단계: 데이터 확인

# 정말 필요하면 데이터 초기화
npm run migrate:reset  # 위험! 데이터 삭제됨

# 대신 특정 테이블만 확인
psql -c "SELECT * FROM sessions ORDER BY created_at DESC LIMIT 10;"

마지막: 원인 기록

# 공개 URL 상태
echo "URL: https://example.com"
echo "Meta tags: $(curl -s https://example.com | grep 'og:title')"
echo "Build time: $(date)"
echo "Database: OK/FAIL"
echo "Cause: Cache/Data/Config issue"

# 로그 파일로 저장
echo "State check" >> /var/log/deployments.log

체크리스트

  1. 빌드 로그 확인 (에러 있나?)
  2. 공개 URL의 HTML 확인
  3. 캐시 비우기
  4. 데이터 상태 확인
  5. 환경 변수 확인
  6. 한 번에 한 가지만 수정
  7. 원인 기록

결국 상태가 꼬인 건 한 순간이 아니고, 빌드→배포→데이터 같은 여러 단계가 안 맞은 것이다. 각 단계를 다시 한 번 차근차근 확인하면 대부분 찾을 수 있다.