[척척학사] 포털 데이터 Redis 캐싱 전략 도입기

박상민·2025년 5월 25일
0

척척학사

목록 보기
9/15
post-thumbnail

✅ 관련 PR: #77
✅ 관련 Issue: #67
✅ 적용 범위: 학업 요약(summary), 학기 정보(semester), 졸업 요건(graduation-progress)

📌 도입 배경

기존에는 다음과 같은 API가 호출될 때마다 RDS에 직접 쿼리를 수행했습니다.

  • /summary: 사용자 학업 요약 정보
  • /semester: 학기별 수강/성적 기록
  • /graduation-progress: 졸업 요건 이수 현황

하지만 이 데이터는 포털 재연동 전까지 변경되지 않으며, 같은 사용자의 동일 요청이 반복적으로 발생하기 때문에 Redis를 통한 캐싱으로 다음과 같은 개선 효과를 기대할 수 있습니다:

  • 응답 속도 개선
  • RDS 부하 감소
  • 중복 처리 방지

고려한 조건

  • 데이터는 포털 재연동 이전까지 고정
  • 포털 연동 및 재연동 시점에만 변경됨
  • 사용자별 데이터를 기준으로 캐시 (→ studentId 기반)
  • TTL(Time To Live)은 우선 30일로 설정
    • 수강신청·정정 등 포털 연동이 집중되는 구간만 재갱신
    • 추후 모니터링을 통해 TTL 조정

Redis 캐시 설계

Redis Key 설계

도메인Redis Key Format
학업 요약student:{studentId}:summary
학기별 정보student:{studentId}:semesters
졸업 요건 진행 현황student:{studentId}:graduation

RedisCacheStore 유틸 메서드

// 저장
redisCacheStore.setAcademicSummary(studentId, response);
redisCacheStore.setSemesterList(studentId, response);
redisCacheStore.setGraduationProgress(studentId, response);

// 조회
redisCacheStore.getAcademicSummary(studentId, ResponseClass.class);
redisCacheStore.getSemesterList(studentId, ElementClass.class);
redisCacheStore.getGraduationProgress(studentId, ResponseClass.class);

// 삭제
redisCacheStore.deleteAllByStudentId(studentId);

캐시 적용 예시: Summary API

public AcademicSummaryResponse getAcademicSummary(UUID studentId) {
    AcademicSummaryResponse cached = redisCacheStore.getAcademicSummary(studentId, AcademicSummaryResponse.class);
    if (cached != null) return cached;

    // DB 조회 후 캐싱
    ...
    redisCacheStore.setAcademicSummary(studentId, response);
    return response;
}

캐시 무효화 처리: 포털 재연동

@PostMapping("/refresh")
public ResponseEntity<?> refreshAndSync(...) {
    ...
    redisCacheStore.deleteAllByStudentId(studentId); // 캐시 무효화
    ...
}

결과 및 효과

  • Dev 서버 기준 평균 응답 속도 개선 (27.3% 단축)
  • RDS 쿼리 호출 감소
    • 기존에는 항상 RDS 쿼리를 호출했다면
    • 캐싱 전략 도입 후에는 TTL이 지난 후에만 RDS 쿼리 호출
  • 동일 요청에 대한 중복 처리 방지

서버 교체 작업 후 리포트 추가 예정!

✅ 최종 요약

Redis 캐싱 전략은 학사 정보의 특성과 구조에 잘 맞는 선택이었으며,
읽기 성능 개선 + 중복 처리 방지 + DB 부하 분산 측면에서
특히 수강신청/성적조회 피크 구간에 효과적일 것이라고 생각합니다.

0개의 댓글