문제 해결
CoreRx 운영 중 발생할 수 있는 일반적인 문제와 해결 방법을 정리합니다. 캐시 불일치, ETL 실패, Docker/Superset 이슈를 다룹니다.
캐시 관련 문제
대시보드 데이터가 오래됨
증상: 대시보드에 표시되는 데이터가 최신 업로드 내용을 반영하지 않습니다.
원인과 해결:
| 확인 순서 | 확인 사항 | 해결 방법 |
|---|---|---|
| 1 | 캐시 메타 상태 확인 | 데이터 관리 탭에서 last_refreshed 확인 |
| 2 | 캐시 갱신이 실행되지 않음 | refresh_all_kpi_cache() 수동 실행 |
| 3 | 캐시 갱신이 failed 상태 | error_message 확인 후 원인 해결 |
| 4 | ETL 자체가 실행되지 않음 | ETL 스크립트 실행 이력 확인 |
캐시 불일치 (원본과 캐시 수치 다름)
증상: SQL Lab에서 원본 테이블을 직접 조회한 결과와 캐시 테이블의 수치가 다릅니다.
원인과 해결:
| 원인 | 해결 방법 |
|---|---|
| 캐시 갱신 후 원본 데이터가 변경됨 | 캐시 재갱신 실행 |
| 캐시 갱신 중 에러로 부분만 갱신됨 | 전체 캐시 재갱신 실행 |
| 원본 쿼리와 캐시 Function의 집계 기준 차이 | 금액 단위(원 vs 백만원), 기간 범위, 필터 조건 확인 |
조치 절차:
corerx_cache_meta에서 해당 캐시의 상태와 갱신 시각을 확인합니다.- 상태가
failed이면error_message를 확인합니다. - 전체 캐시를 재갱신합니다.
SELECT refresh_all_kpi_cache(
'4b5b1d04-23f6-42a7-9fe5-acb0a9998c55',
'manual'
);
캐시 갱신 실패 (status = failed)
증상: corerx_cache_meta의 상태가 failed로 표시됩니다.
일반적인 원인:
| 에러 메시지 | 원인 | 해결 |
|---|---|---|
| out of memory | PostgreSQL 메모리 부족 | work_mem 설정 확인 및 조정 |
| deadlock detected | 동시 갱신 충돌 | 단일 세션에서 재실행 |
| relation does not exist | 테이블 미존재 | create_tables.py 실행 또는 마이그레이션 확인 |
| division by zero | 분모가 0인 데이터 | NULLIF 처리 확인. DB Function 점검 |
ETL 관련 문제
UBIST 엑셀 파싱 실패
증상: ubist_import.py 실행 시 헤더 파싱 에러가 발생합니다.
원인과 해결:
| 원인 | 해결 방법 |
|---|---|
| UBIST 엑셀 파일 형식 변경 | 새 파일의 컬럼 구조 확인. 헤더 행(1~2행) 매핑 코드 수정 필요 |
| 파일이 손상됨 | UBIST에서 파일 재다운로드 |
| 인코딩 문제 | 엑셀 파일을 다시 저장 (UTF-8) |
디버깅 절차:
--dry-run옵션으로 먼저 테스트합니다.- 에러 메시지에서 실패한 행 번호를 확인합니다.
- 해당 행의 데이터를 엑셀에서 직접 확인합니다.
python3 scripts/ubist_import.py --file "UBIST_D1 Sales.xlsx" --dry-run
ETL 실행 중 DB 연결 끊김
증상: ETL 실행 중 connection reset 또는 server closed the connection 에러가 발생합니다.
원인과 해결:
| 원인 | 해결 방법 |
|---|---|
| 네트워크 불안정 | 서버 네트워크 상태 확인 후 재실행 |
| PostgreSQL 타임아웃 | statement_timeout 설정 확인 (대용량 ETL은 제한 해제 필요) |
| Docker 컨테이너 재시작 | Supabase Docker 상태 확인 (docker ps) |
supply_qty 타입 에러
증상: 매출 집계 시 cannot cast text to numeric 에러가 발생합니다.
원인: kpis_gap_rows.supply_qty는 TEXT 타입입니다. 합산 시 반드시 CAST가 필요합니다.
해결: 모든 쿼리에서 supply_qty::numeric 또는 CAST(supply_qty AS numeric)을 사용합니다.
주의:
supply_qty컬럼은 기존 테이블(kpis_gap_rows)의 컬럼이므로 타입 변경(ALTER)이 금지됩니다. KPIS, CSO Web 사이트에서 공유하는 테이블입니다.
Docker/Superset 관련 문제
Superset 컨테이너 시작 실패
증상: Superset Docker 컨테이너가 시작되지 않거나, 시작 후 즉시 종료됩니다.
확인 절차:
- Docker 컨테이너 상태를 확인합니다.
sudo docker compose -f docker-compose.superset.yml ps
- 실패한 컨테이너의 로그를 확인합니다.
sudo docker compose -f docker-compose.superset.yml logs --tail 100
일반적인 원인:
| 원인 | 해결 방법 |
|---|---|
| 포트 충돌 (8050) | 해당 포트를 사용하는 다른 프로세스 확인 및 종료 |
| 메모리 부족 | 서버 메모리 확인. 불필요한 컨테이너 정리 |
| 볼륨 권한 문제 | Docker 볼륨 권한 확인 |
Superset 대시보드 접속 불가
증상: 브라우저에서 대시보드 URL에 접속할 수 없습니다.
확인 절차:
| 확인 순서 | 확인 사항 | 명령어 |
|---|---|---|
| 1 | Docker 컨테이너 실행 중 | sudo docker ps |
| 2 | Superset 포트 리스닝 | sudo ss -tlnp | grep 8050 |
| 3 | Nginx 프록시 동작 | sudo nginx -t && sudo systemctl status nginx |
| 4 | SSL 인증서 유효 | sudo certbot certificates |
Superset 재배포
문제 해결 후 Superset을 재배포해야 하는 경우:
bash scripts/redeploy_superset.sh
이 스크립트는 Docker 컨테이너를 중지, 재빌드, 재시작합니다.
PostgreSQL 관련 문제
DB 연결 실패
증상: ETL 스크립트 또는 Superset에서 DB 연결이 실패합니다.
확인 절차:
- Supabase Docker 컨테이너 상태를 확인합니다.
sudo docker ps | grep supabase
- PostgreSQL 포트(5432)가 리스닝 중인지 확인합니다.
sudo ss -tlnp | grep 5432
- 직접 연결을 시도합니다.
psql -h localhost -p 5432 -U postgres -d postgres
디스크 용량 부족
증상: ETL 실행 또는 캐시 갱신 시 no space left on device 에러가 발생합니다.
확인 및 해결:
- 디스크 사용량을 확인합니다.
df -h
- Docker 이미지/볼륨 정리로 공간을 확보합니다.
sudo docker system prune -f
- PostgreSQL WAL 로그가 과도하게 쌓인 경우 체크포인트를 실행합니다.
공통 진단 절차
문제 발생 시 다음 순서로 진단합니다:
- 증상 확인: 대시보드 화면, 에러 메시지, 로그를 수집합니다.
- 서비스 상태 확인: Docker 컨테이너, Nginx, PostgreSQL 상태를 확인합니다.
- 로그 확인: Superset 로그, PostgreSQL 로그, ETL 스크립트 출력을 확인합니다.
- 원인 특정: 네트워크, 디스크, 메모리, 데이터 문제 중 어떤 것인지 구분합니다.
- 해결 후 검증: 문제 해결 후 캐시 갱신 → 대시보드 확인으로 정상 동작을 검증합니다.