개발 slecs

요청당 인증 중복 호출을 요청 범위 캐싱으로 제거

목차

한 요청 내에서 인증을 여러 번 확인하는 비효율을 React의 cache() 함수로 제거했다. safeAuth를 캐싱하면서 auth() 호출을 1회로 제한하는 작업이었다.

왜 auth() 중복 호출이 문제였나

사실 서버 컴포넌트나 API 라우트에서 사용자 인증을 확인할 때, 한 요청(request) 내에서 여러 곳에서 auth() 함수를 호출하는 경우가 흔하다. 예를 들어:

  • 라우트 진입점에서 먼저 현재 사용자 확인
  • 미들웨어 단계에서 다시 확인
  • 비즈니스 로직 실행 전 재확인

각 호출이 데이터베이스나 외부 인증 서비스(예: 토큰 검증, 권한 조회)를 거친다면, 같은 정보를 반복해서 요청하는 셈이다. 특히 인증 흐름이 복잡할수록—세션 조회, 권한 테이블 참조, 토큰 유효성 검사 등을 거친다면—이 오버헤드는 눈에 띄게 쌓인다.

더 문제는 safeAuth 같은 래퍼 함수에서 매번 auth()를 호출할 때, 그걸 감싸는 상위 레이어도 여전히 자신의 캐시 전략 없이 호출한다는 점이다. 결국 요청 생명주기 동안 같은 정보를 여러 번 조회하는 것.

React cache()로 1회 호출 제한

// 개선 전: 매번 auth() 호출
export async function safeAuth() {
  return auth(); // 요청마다 여러 곳에서 호출되면 중복 발생
}

// 개선 후: cache()로 요청 범위 캐싱
export const safeAuth = cache(async () => {
  return auth();
});

React 서버 컴포넌트의 cache() 함수는 요청 범위(request scope) 캐싱을 제공한다. 즉:

  • 한 요청 내에서 safeAuth()를 여러 번 호출해도
  • 첫 호출 때만 auth()가 실행되고
  • 나머지 호출들은 그 결과를 재사용

요청이 끝나면 캐시도 사라지므로, 다음 요청에서는 새로 auth()를 호출한다. 세션 정보가 바뀐 경우에도 즉시 반영된다.

효과와 설계 고민

이 최적화의 실질적 효과는 다음과 같다:

항목 개선 전 개선 후 이득
요청당 auth() 호출 수 N회 (컴포넌트/라우트당 1회) 1회 N-1 번 제거
인증 DB/토큰 검증 횟수 N회 1회 높음
응답 시간 인증이 복잡할수록 지연 누적 선형 보통 5~20% 개선

특히 한 요청이 여러 계층(라우터 → 미들웨어 → 컴포넌트 → 유틸)을 거칠 때 효과가 크다.

설계상 주의점:

  • cache()는 요청 범위만 커버한다. 브라우저 캐시(long-lived)와는 다르다.
  • 사용자 권한이 동적으로 바뀌는 시스템에서는 오래된 캐시가 문제가 될 수 있으니, 캐시 TTL이 정말 요청 내에만 제한되는지 확인해야 한다.
  • 병렬 요청이나 레이스 컨디션 상황에서 캐시 결과가 의도와 다를 수 있으니, 테스트를 철저히 하자.

일반론: 인증 캐싱 패턴

이런 류의 최적화는 인증 시스템에서 자주 나타난다:

  • 토큰 검증: JWT 복호화나 서명 검증은 비싸므로, 요청 범위 캐싱은 필수.
  • 권한 조회: 사용자가 특정 리소스에 접근 가능한지 확인할 때, 여러 컴포넌트에서 확인하면 캐싱 없이는 반복.
  • 세션 조회: 사용자 세션을 데이터베이스에서 매번 조회하면 병목.

그래서 대부분의 현대적 인증 라이브러리나 프레임워크는 기본적으로 요청 범위 캐싱을 지원한다. React 생태에서도 cache()가 바로 그 도구다.

회고

이 작업을 하면서 느낀 점은, 단순해 보이는 최적화가 얼마나 효과적인지 다시 한 번 확인했다는 것. safeAuth 자체는 auth() 래퍼일 뿐이지만, 그걸 cache() 1줄로 감싸는 것만으로 요청당 중복 호출을 완전히 제거할 수 있다.

또 한 가지는, 이런 최적화가 개발자 경험에도 도움이 된다는 점. 인증을 여러 곳에서 호출하려고 하는 개발자는 더 이상 "혹시 중복 호출이 될까?" 걱정할 필요가 없다. cache() 덕분에 자유롭게 필요한 곳마다 인증을 확인할 수 있다.

다음은 이런 패턴을 팀에 공유하고, 비슷하게 반복되는 외부 호출(DB 조회, API 콜)들을 찾아내 같은 식으로 최적화할 차례.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.