45 lines
3.0 KiB
Markdown
45 lines
3.0 KiB
Markdown
# 긴급 수정 보고서 (Hotfix Report): 영업관리 서버 에러 해결
|
|
|
|
## 1. 장애 개요
|
|
* **에러 메시지**: `Session check failed: SyntaxError: Unexpected token 'E', "Error:SQLS"... is not valid JSON`
|
|
* **증상**: 로컬 개발 환경에서는 정상 작동하나, 실서버(`sales.codebridge-x.com`) 접속 시 대시보드 로딩 실패 및 세션 체크 오류 발생.
|
|
|
|
## 2. 원인 분석
|
|
|
|
### 가. 환경 설정 불일치 (주요 원인)
|
|
* **로컬/도커 환경**: DB 호스트명을 `mysql`로 사용하도록 설정됨 (도커 컴포즈 표준).
|
|
* **실서버 환경**: 표준 리눅스 환경으로 DB 호스트가 `localhost`로 설정되어야 함.
|
|
* **.env 파일 누락**: 보안상 Git 추적에서 제외된 `.env` 파일이 서버에 생성되지 않음. 이로 인해 시스템이 로컬용 기본값(`mysql`)을 사용하면서 접속 실패.
|
|
|
|
### 나. 부적절한 에러 핸들링 (연쇄 원인)
|
|
* `lib/mydb.php`에서 DB 접속 실패 시 `die("Error: " . $msg)`를 사용하여 프로세스를 종료함.
|
|
* 이로 인해 API가 JSON 형식이 아닌 일반 텍스트 문자열을 반환하게 됨.
|
|
* React 프론트엔드가 이 문자열을 JSON으로 파싱하려다 첫 글자인 'E'에서 `SyntaxError`를 일으킴.
|
|
|
|
### 다. DB 접속 권한 차이
|
|
* 실서버는 보안상 `root` 계정이 아닌 전용 계정(`codebridge`)을 사용해야 하는데, 설정 파일 부재로 기본값인 `root` 인증을 시도함.
|
|
|
|
## 3. 해결 단계
|
|
|
|
### 1단계: 에러 보고 방식 개선
|
|
`lib/mydb.php`에서 `die()` 대신 `throw new Exception()`을 사용하도록 수정. 이제 접속 실패 시에도 API가 구조화된 JSON 응답(`{success: false, error: "..."}`)을 반환하여 프론트엔드가 에러 내용을 정확히 표시할 수 있게 됨.
|
|
|
|
### 2단계: 자동 환경 설정 도구 배포 (`fix_env.php`)
|
|
SSH 접속이 제한된 상황에서 서버 환경을 진단하고 복구하기 위한 스크립트 제작:
|
|
1. 서버 내 인접 폴더(`sales_org`)에서 실제 운영 중인 `.env` 파일을 자동으로 탐색.
|
|
2. 탐색된 정보(DB 유저명, 비밀번호 등)를 현재 프로젝트 경로에 맞춰 재구성하여 새로운 `.env` 파일 생성.
|
|
|
|
### 3단계: 프로덕션 환경 최적화
|
|
* `lib/mydb.php`의 기본 호스트값을 `localhost`로 변경하여 호환성 강화.
|
|
* `index.php` 내 로그인 입력 필드에 `autocomplete` 속성을 추가하여 브라우저 경고 해결.
|
|
|
|
## 4. 향후 방지 대책
|
|
1. **환경 설정 관리**: 새로운 서버 배포 시 `.env` 설정 확인을 필수 체크리스트에 포함.
|
|
2. **응답 구조 통일**: JSON API를 제공하는 PHP 파일에서는 절대 `die()`나 `echo`를 직접 사용하지 않고, 반드시 제어된 JSON 인코더를 통해 응답.
|
|
3. **진단 도구 활용**: 이번에 사용된 `fix_env.php`와 같은 진단용 스크립트는 설정이 완료된 후 즉시 삭제하여 보안 유지.
|
|
|
|
---
|
|
**상태**: 해결 완료
|
|
**일자**: 2026-01-04
|
|
**작성**: Antigravity AI
|