한컴인스페이스
플랫폼 성능 최적화
2024.04 ~ 2025.03
인증 시스템·영상 API 성능 개선
Spring BootGoRedisGDALSpring Cloud GatewayPostgreSQLNginxK8s
어드민 인증 시스템과 영상 타일링 API 두 영역의 성능 병목을 해결했습니다. Redis 전체 세션 풀스캔 구조와 재귀 트리 권한 N+1 쿼리로 인증 응답이 저하되는 문제, WMS 방식의 바운더리 합성으로 영상 수가 늘수록 API 응답이 선형 증가하는 문제를 각각 근본 원인부터 해결했습니다.
역할별 수행 내용
어드민 인증 시스템 최적화
- Redis 역인덱스 구축으로 풀스캔 제거 — userId → sessionId 목록 구조로 저장하여 권한 변경 시 해당 유저의 세션만 즉시 조회 및 갱신
- Redis DB 3개로 용도 분리 (세션 / 방문자 통계 / 로그인 실패 추적), IP + userId 단위 4회 초과 시 10분 잠금으로 브루트포스 방지
- 재귀적 트리 구조 메뉴에서 건별 조회 → WITH RECURSIVE CTE + 단일 쿼리 전환, 인증 필터에서 전체 권한 정보를 한 번에 로드 후 메모리 매핑
- Spring Cloud Gateway 도입으로 인증·라우팅·로깅 공통 처리 일원화
영상 타일링 API 성능 개선 (Go + GDAL)
- WMS는 요청마다 해당 바운더리의 영상을 동적으로 겹쳐 합성하므로 영상 수가 늘수록 응답 시간이 선형 증가 — WMTS로 전환해 z/x/y 좌표를 캐시 키로 고정, 합성 결과를 Redis에 저장하여 동일 타일 재요청 시 합성 연산 완전 스킵
- Go 고루틴으로 타일 생성 단계를 병렬화 — 요청된 좌표 범위의 타일들을 동시에 생성 후 Redis에 적재, 이후 요청은 Redis hit 즉시 반환
- Nginx Ingress upstream keepalive로 Pod 커넥션 풀 관리 — 매 요청마다 TCP 핸드셰이크가 반복되던 오버헤드 제거
- GDAL 기반 GeoTIFF → PNG/Vector Tile 변환 파이프라인, MBTiles 벡터 타일링으로 줌 레벨·타일 좌표 기반 폴리곤 선별 렌더링
주요 성과
- 전체 세션을 풀스캔해야 하는 Redis 구조로 권한 변경이 일부 서비스에 즉시 반영되지 않던 문제를 userId→sessionId 역인덱스로 해결 — O(N) 풀스캔→O(1) 조회, 권한 변경 실시간 반영
- 매 요청마다 재귀 트리 구조 메뉴 권한을 DB에서 반복 조회하던 N+1 문제를 WITH RECURSIVE CTE + 메모리 매핑으로 해결 — 요청당 DB 쿼리 제거
- 영상 수가 늘수록 WMS 방식의 바운더리 합성 응답 시간이 선형 증가하던 문제를 WMTS + Redis 타일 캐싱으로 해결 — API 응답 4초→0.5초 미만 달성
- 서비스별로 분산 관리되던 인증·라우팅·로깅 코드를 Spring Cloud Gateway로 일원화 — 각 서비스별 세션 관리 불필요