실패 격리와 캐시
왜 필요한가
섹션 제목: “왜 필요한가”학교 서버는 느리거나(비교과 일정은 수십 초가 걸리기도 합니다), 일시적으로 응답하지 않거나, 응답 모양을 바꿀 수 있습니다. 이런 일이 한 곳에서 생겼다고 앱 전체가 멈추면 곤란합니다. 또 같은 요청을 사용자 수만큼 학교에 보내면 학교 서버에 부담이 됩니다.
호출 한 번의 흐름
섹션 제목: “호출 한 번의 흐름”공개 데이터의 실패 격리
섹션 제목: “공개 데이터의 실패 격리”공개 데이터(SejongPublicData)의 모든 메서드는 같은 규칙을 따릅니다.
- 연결 실패, 시간 초과, 2xx가 아닌 상태, JSON이 아닌 본문, 기대한 키가 없음, 학교의
_SUBMIT_ERROR_응답 중 무엇이든 예외 없이 마지막 캐시 값(만료됐어도)이나 빈 값(빈 목록, 기숙사 공지는 빈 객체)을 돌려줍니다. - 학교 서버 내부 정보(
STACK_TRACE등)는 로그에도 결과에도 내보내지 않습니다. - 던지는 경우는 잘못된 입력뿐입니다: 빈 학과 코드나 과목 번호의
curriculum_courses, 형식이 틀린 사이트 이름의graduate_calendar(INVALID_INPUT, 요청 없음).lectures는 필터 때문에 던지지 않습니다. - 값이 없으면 빈 문자열이고(
views,total은 0, 좌표는 0.0), 행이 하나 이상해도 목록 전체가 실패하지 않습니다. 실패로 보는 것은 컨테이너(data,items,events등)가 없거나 배열이 아닐 때뿐입니다.
| 항목 | 기본값 | 동작 |
|---|---|---|
| 캐시 유지 | 86400초 (24시간) | 메서드와 인자마다 메모리에 저장. 신선한 캐시가 있으면 요청하지 않음 |
| 실패 기억 | 60초 | 실패했고 캐시된 값이 없으면 그 시간 동안 같은 호출은 요청 없이 빈 값을 돌려줌. 만료된 캐시 값이 있으면 실패해도 그 값을 돌려줌 |
| 최대 항목 수 | 500개 | 가득 차면 가장 오래된 항목을 밀어냄 |
- 같은 인자로 동시에 부르면 요청 하나를 같이 씁니다.
- 키마다 잠금을 쓰지만 항목과 함께 풀리므로, 사용자가 입력한 검색어를 넘겨도 메모리가 끝없이 늘지 않습니다.
- 한 호출은 요청 한 건이 원칙입니다. 예외는
cafeteria_places로, 번호 1~10을 차례로 최대 10건 요청하고, 하나라도 실패하면 목록 전체를 실패로 보아 부분 목록이 하루 동안 캐시되지 않게 합니다. - 개설강좌를 조건 없이 부르면 학부 한 학기가 몇 MB라서 캐시 항목 하나가 큽니다. 가능하면 학과 단위로 나눠 부르세요 (개설강좌).
SejongPublicData는 프로세스당 하나만 만드세요. 캐시와 요청 합치기가 인스턴스 안에 있습니다.
각 설정(cache_ttl_seconds, failure_cache_seconds, cache_max_entries)은 공통 규칙에 있습니다.
인증의 실패 격리
섹션 제목: “인증의 실패 격리”| 단계 | 실패하면 |
|---|---|
| 입력 확인, 포털 로그인 | 호출 전체 실패 |
| DHC (학생 정보, 고전독서) | 호출 전체 실패 |
| SIS (연락처, 학교 코드) | 호출은 성공, 그 필드만 null |
포털 메인 (parentUnitName) |
호출은 성공, 그 필드만 null |
인증과 공개 데이터는 서로 실패에 영향을 주지 않습니다. 두 코드는 서로를 임포트하지 않도록 의존 규칙 테스트가 지킵니다.
직접 구현한다면
섹션 제목: “직접 구현한다면”- 외부 서버 실패를 앱의 실패로 번지지 않게 하고, 마지막 정상 값을 보관해 두세요.
- 실패 직후 같은 요청을 쏟아내지 말고 짧게 기억해 두세요.
- 동시 요청은 합치세요.
이어서 보기
섹션 제목: “이어서 보기”- 원본: spec/PUBLIC_DATA.md의 Failure isolation and cache
- 매일 도는 실제 포털 점검
