콘텐츠로 이동

실패 격리와 캐시

학교 서버는 느리거나(비교과 일정은 수십 초가 걸리기도 합니다), 일시적으로 응답하지 않거나, 응답 모양을 바꿀 수 있습니다. 이런 일이 한 곳에서 생겼다고 앱 전체가 멈추면 곤란합니다. 또 같은 요청을 사용자 수만큼 학교에 보내면 학교 서버에 부담이 됩니다.

공개 데이터(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

인증과 공개 데이터는 서로 실패에 영향을 주지 않습니다. 두 코드는 서로를 임포트하지 않도록 의존 규칙 테스트가 지킵니다.

  • 외부 서버 실패를 앱의 실패로 번지지 않게 하고, 마지막 정상 값을 보관해 두세요.
  • 실패 직후 같은 요청을 쏟아내지 말고 짧게 기억해 두세요.
  • 동시 요청은 합치세요.