|
| 1 | +# 서버 시작 시퀀스 & 에러 복구 정책 |
| 2 | + |
| 3 | +## 1. 시작 시퀀스 개요 |
| 4 | + |
| 5 | +서버가 기동될 때 아래 순서로 단계를 순차 실행합니다. |
| 6 | +각 단계는 에러 코드를 반환하며, 코드에 따라 자동 복구 / 에러 페이지 / 공장 초기화 중 하나로 분기합니다. |
| 7 | + |
| 8 | +``` |
| 9 | +서버 프로세스 시작 |
| 10 | + │ |
| 11 | + ├─ [STEP 1] 환경변수 검증 |
| 12 | + ├─ [STEP 2] Setup Check → installed.lock 존재 여부 |
| 13 | + ├─ [STEP 3] 구동 모드 판단 → Mode 1 (로컬) / Mode 2 (서버) / ... |
| 14 | + ├─ [STEP 4] DB 연결 및 상태 체크 |
| 15 | + ├─ [STEP 5] 마이그레이션 실행 |
| 16 | + ├─ [STEP 6] API 서버 기동 및 라우트 등록 |
| 17 | + └─ [STEP 7] 업데이트 채널 확인 → 비동기 백그라운드 (시작 흐름 차단 안 함) |
| 18 | +``` |
| 19 | + |
| 20 | +--- |
| 21 | + |
| 22 | +## 2. 에러 코드 분류 |
| 23 | + |
| 24 | +### BOOT_xxx — 환경/설정 에러 |
| 25 | + |
| 26 | +| 코드 | 설명 | 복구 방식 | |
| 27 | +|------|------|----------| |
| 28 | +| `BOOT_ENV_MISSING` | 필수 환경변수 누락 | 에러 페이지 (누락 항목 안내) | |
| 29 | +| `BOOT_ENV_INVALID` | 환경변수 형식 오류 | 에러 페이지 | |
| 30 | +| `BOOT_PORT_CONFLICT` | 포트 이미 사용 중 | 에러 페이지 (포트 변경 안내) | |
| 31 | + |
| 32 | +### SETUP_xxx — Setup / 설치 상태 에러 |
| 33 | + |
| 34 | +| 코드 | 설명 | 복구 방식 | |
| 35 | +|------|------|----------| |
| 36 | +| `SETUP_NOT_INSTALLED` | `installed.lock` 없음 | → Setup 모드로 기동 (정상 플로우) | |
| 37 | +| `SETUP_LOCK_CORRUPTED` | `installed.lock` 파싱 불가 | → 자동 복구: lock 재생성 시도 | |
| 38 | +| `SETUP_LOCK_MISMATCH` | lock 버전과 앱 버전 불일치 | → 마이그레이션 시도 후 복구 불가 시 에러 페이지 | |
| 39 | + |
| 40 | +### DB_xxx — DB 연결 에러 |
| 41 | + |
| 42 | +| 코드 | 설명 | 복구 방식 | |
| 43 | +|------|------|----------| |
| 44 | +| `DB_CONNECT_RETRY` | 일시적 연결 실패 | → 자동 복구: 3회 재시도 (exponential backoff) | |
| 45 | +| `DB_CONNECT_FAILED` | 재시도 후에도 연결 불가 | 에러 페이지 (연결 설정 확인 안내) | |
| 46 | +| `DB_FILE_NOT_FOUND` | SQLite 파일 없음 (설치 후 삭제됨) | → 공장 초기화 (Setup 모드 복귀) | |
| 47 | +| `DB_SCHEMA_MISSING` | 테이블 구조가 없음 (빈 DB) | → 공장 초기화 (Setup 모드 복귀) | |
| 48 | +| `DB_SCHEMA_CORRUPTED` | 스키마 무결성 깨짐 | → 공장 초기화 (Setup 모드 복귀) | |
| 49 | +| `DB_ADMIN_NOT_FOUND` | 관리자 계정이 DB에 없음 | → 공장 초기화 (Setup 모드 복귀) | |
| 50 | + |
| 51 | +### MIGRATION_xxx — 마이그레이션 에러 |
| 52 | + |
| 53 | +| 코드 | 설명 | 복구 방식 | |
| 54 | +|------|------|----------| |
| 55 | +| `MIGRATION_PENDING` | 미실행 마이그레이션 존재 | → 자동 복구: 자동 실행 | |
| 56 | +| `MIGRATION_FAILED` | 마이그레이션 실행 실패 | 에러 페이지 (실패 항목, 롤백 여부 표시) | |
| 57 | +| `MIGRATION_UNRECOVERABLE` | 롤백도 불가한 마이그레이션 실패 | → 공장 초기화 권장 (에러 페이지에서 선택) | |
| 58 | + |
| 59 | +### SERVER_xxx — 서버 기동 에러 |
| 60 | + |
| 61 | +| 코드 | 설명 | 복구 방식 | |
| 62 | +|------|------|----------| |
| 63 | +| `SERVER_ROUTE_FAILED` | 라우트 등록 실패 (모듈 오류) | 에러 페이지 (문제 모듈 표시) | |
| 64 | +| `SERVER_MODULE_LOAD_FAILED` | 모듈 로드 실패 | → 자동 복구: 해당 모듈 비활성화 후 계속 기동 | |
| 65 | + |
| 66 | +### 미분류 에러 (Fallback) |
| 67 | + |
| 68 | +정의된 에러 코드에 해당하지 않는 예외가 발생한 경우: |
| 69 | + |
| 70 | +| 코드 | Exit Code | 설명 | 복구 방식 | |
| 71 | +|------|-----------|------|----------| |
| 72 | +| `UNKNOWN_ERROR` | `1` | 정의되지 않은 예외 | 에러 페이지 (원본 에러 메시지 + 스택 트레이스 표시) | |
| 73 | + |
| 74 | +``` |
| 75 | +try { |
| 76 | + // 시작 시퀀스 |
| 77 | +} catch (err) { |
| 78 | + // 어떤 에러 코드에도 해당하지 않는 경우 |
| 79 | + // → UNKNOWN_ERROR + exit code 1 |
| 80 | + // → 에러 페이지에 원본 에러 메시지와 발생 위치 표시 |
| 81 | +} |
| 82 | +``` |
| 83 | + |
| 84 | +> 프로덕션 환경에서는 스택 트레이스를 에러 페이지에 노출하지 않고 |
| 85 | +> 서버 로그에만 기록하며, 에러 페이지에는 에러 ID(타임스탬프 기반)만 표시합니다. |
| 86 | +> 관리자가 해당 ID로 로그에서 원인을 추적할 수 있도록 합니다. |
| 87 | +
|
| 88 | +--- |
| 89 | + |
| 90 | +## 3. 복구 시퀀스 상세 |
| 91 | + |
| 92 | +### 3.1 자동 복구 (Auto Recovery) |
| 93 | + |
| 94 | +사용자 개입 없이 서버가 스스로 처리합니다. |
| 95 | + |
| 96 | +``` |
| 97 | +DB_CONNECT_RETRY |
| 98 | + └─ 1초 후 재시도 → 2초 후 재시도 → 4초 후 재시도 (최대 3회) |
| 99 | + ├─ 성공 → 시퀀스 계속 |
| 100 | + └─ 실패 → DB_CONNECT_FAILED 로 격상 |
| 101 | +
|
| 102 | +MIGRATION_PENDING |
| 103 | + └─ 마이그레이션 자동 실행 |
| 104 | + ├─ 성공 → 시퀀스 계속 |
| 105 | + └─ 실패 → MIGRATION_FAILED 로 격상 |
| 106 | +
|
| 107 | +SERVER_MODULE_LOAD_FAILED |
| 108 | + └─ 문제 모듈 비활성화 처리 후 나머지 모듈로 계속 기동 |
| 109 | + └─ 관리자 대시보드에 비활성화된 모듈 경고 표시 |
| 110 | +``` |
| 111 | + |
| 112 | +### 3.2 에러 페이지 (Error Page) |
| 113 | + |
| 114 | +서버는 기동되지만 최소한의 에러 UI만 서빙합니다. |
| 115 | + |
| 116 | +- 에러 코드, 원인, 해결 방법 안내 |
| 117 | +- 설정 파일 경로, 누락된 환경변수 등 구체적 정보 표시 |
| 118 | +- 수동 조치 후 재시작하면 정상 복구 가능한 케이스 |
| 119 | + |
| 120 | +``` |
| 121 | +BOOT_ENV_MISSING → "다음 환경변수가 없습니다: [목록]" |
| 122 | +DB_CONNECT_FAILED → "DB에 연결할 수 없습니다. 연결 설정을 확인하세요." |
| 123 | +MIGRATION_FAILED → "마이그레이션 [이름]이 실패했습니다. 로그를 확인하세요." |
| 124 | +SERVER_ROUTE_FAILED → "모듈 [이름] 로드 중 오류가 발생했습니다." |
| 125 | +``` |
| 126 | + |
| 127 | +### 3.3 공장 초기화 (Setup 모드 복귀) |
| 128 | + |
| 129 | +DB 또는 설치 상태가 복구 불가능한 경우입니다. |
| 130 | + |
| 131 | +``` |
| 132 | +DB_FILE_NOT_FOUND |
| 133 | +DB_SCHEMA_MISSING |
| 134 | +DB_SCHEMA_CORRUPTED |
| 135 | +DB_ADMIN_NOT_FOUND |
| 136 | +MIGRATION_UNRECOVERABLE |
| 137 | + │ |
| 138 | + └─ 에러 페이지에 "공장 초기화" 버튼 표시 |
| 139 | + └─ 관리자가 확인 → installed.lock 삭제 + DB 초기화 |
| 140 | + └─ 서버 재시작 → Setup 모드로 자동 복귀 |
| 141 | +``` |
| 142 | + |
| 143 | +> 공장 초기화는 **자동으로 실행되지 않습니다.** |
| 144 | +> 반드시 사용자(관리자)가 에러 페이지에서 명시적으로 선택해야 합니다. |
| 145 | +> 데이터 복구가 불가능하므로 이중 확인(에러 코드 입력 등)을 권장합니다. |
| 146 | +
|
| 147 | +--- |
| 148 | + |
| 149 | +## 4. 구동 모드 판단 |
| 150 | + |
| 151 | +Setup check 통과 후 구동 모드를 결정합니다. |
| 152 | +구동 모드는 `installed.lock` 또는 환경변수에서 읽어옵니다. |
| 153 | + |
| 154 | +| 모드 | 설명 | 특이사항 | |
| 155 | +|------|------|---------| |
| 156 | +| Mode 1 (로컬) | 단일 사용자, 로컬 실행 | CLI 초기화 명령 사용 가능 | |
| 157 | +| Mode 2 (서버) | 다중 사용자, 네트워크 서빙 | 화이트리스트 기반 접근 제어 | |
| 158 | + |
| 159 | +--- |
| 160 | + |
| 161 | +## 5. 업데이트 채널 확인 |
| 162 | + |
| 163 | +시작 시퀀스를 **차단하지 않고** 백그라운드에서 비동기로 처리합니다. |
| 164 | + |
| 165 | +``` |
| 166 | +서버 기동 완료 후 백그라운드에서: |
| 167 | + └─ 업데이트 서버에 현재 버전 + 채널 정보 전송 |
| 168 | + ├─ 응답 있음 → 최신 버전 정보 캐시, 관리자 대시보드에 표시 |
| 169 | + └─ 응답 없음 (타임아웃 5초) → 무시, 다음 주기에 재시도 |
| 170 | +``` |
| 171 | + |
| 172 | +채널 종류: `stable` / `beta` / `nightly` |
| 173 | + |
| 174 | +--- |
| 175 | + |
| 176 | +## 6. 전체 분기 요약 |
| 177 | + |
| 178 | +``` |
| 179 | +서버 시작 |
| 180 | + │ |
| 181 | + ├─ 환경변수 오류 → [에러 페이지] |
| 182 | + ├─ installed.lock 없음 → [Setup 모드] |
| 183 | + ├─ DB 연결 일시 실패 → [자동 재시도] → 성공 시 계속 / 실패 시 에러 페이지 |
| 184 | + ├─ DB 파일/스키마 손상 → [에러 페이지 + 공장 초기화 버튼] |
| 185 | + ├─ 마이그레이션 미실행 → [자동 실행] → 성공 시 계속 / 실패 시 에러 페이지 |
| 186 | + ├─ 모듈 로드 실패 → [해당 모듈 비활성화 후 계속] |
| 187 | + └─ 모든 단계 통과 → [정상 앱 모드 기동] |
| 188 | +``` |
0 commit comments