로컬 설정 JSON 일부가 잘린 상태에서 앱이 시작 화면을 넘지 못했다. 파싱 예외를 잡아 전체 설정 파일을 삭제하면 앱은 켜졌지만 사용자의 정상 설정까지 모두 사라졌다. 파일 하나 안에 여러 기능의 값이 섞여 있어 실패 범위가 너무 컸다.
무조건 성공하거나 전부 초기화하는 두 선택 사이에 부분 복구가 필요했다.
구조와 값 검증을 나눴다
먼저 JSON 문법을 읽고, 그다음 각 영역의 스키마와 값 범위를 검증했다.
var document = JsonDocument.Parse(raw);
var appearance = TryReadAppearance(document) ?? Appearance.Default;
var chart = TryReadChart(document) ?? ChartSettings.Default;
var alarms = TryReadAlarms(document) ?? AlarmSettings.Default;
문법 자체가 깨졌으면 마지막 정상 백업을 시도하고, 특정 영역만 잘못됐으면 그 영역만 기본값으로 바꿨다.
복구 결과를 사용자가 알 수 있게 했다
조용히 초기화하면 나중에 설정이 사라진 이유를 알 수 없다. 복구한 영역과 백업 위치를 민감하지 않은 표현으로 안내하고 다시 설정할 수 있는 화면으로 연결했다.
로그에는 원본 JSON이나 사용자 값을 남기지 않고 형식 버전, 실패 영역, 복구 방식만 기록했다.
복구 안내가 반복되지 않도록 정상 형식으로 다시 저장된 뒤에는 해당 상태를 끝냈다. 아직 복구되지 않은 백업을 사용자가 덮어쓰지 않게 설정 화면의 저장 시점도 조정했다.
정상 파일 교체는 원자적으로 했다
저장 중 앱이 종료돼 반쪽 파일이 생기지 않도록 임시 파일에 쓴 뒤 검증하고 교체했다.
새 내용 -> temp 저장 -> 재읽기 검증
-> 기존 파일 백업 -> temp를 활성 파일로 교체
WebGL처럼 저장 구현이 다른 플랫폼에서도 같은 완료 의미를 제공하도록 저장소 인터페이스에서 처리했다.
복구 코드는 고장 난 입력으로 시험했다
필드 누락, 잘못된 타입, 범위 밖 숫자, 중간에서 잘린 JSON, 알 수 없는 새 필드를 생성해 확인했다. 알 수 없는 필드를 무조건 오류로 보지 않아 앞으로의 형식 확장도 고려했다.
이 작업 뒤 예외를 잡는 것만으로 복구됐다고 말하지 않는다. 정상 데이터를 얼마나 보존했고 다음 저장이 다시 정상 형식이 되는지 확인한다. 견고함은 오류를 숨기는 게 아니라 영향 범위를 줄이는 일이었다.