피드로 돌아가기
no-cycle finds 0 cycles in next.js (and other lies caches tell you)
Dev.toDev.to
Frontend

캐시 오염 해결을 통해 Next.js 내 숨겨진 245개 순환 참조 탐지

no-cycle finds 0 cycles in next.js (and other lies caches tell you)

Ofri Peretz2026년 5월 24일6advanced

Context

DFS 기반의 Circular Dependency 탐지 시 성능 최적화를 위해 nonCyclicFiles 캐시를 도입한 구조임. 하지만 maxDepth 제한으로 인해 탐색이 중단된 파일을 무조건 Acyclic으로 판단하여 캐싱하는 설계 결함이 존재함.

Technical Solution

  • DFS 탐색 중 maxDepth 도달 시 depthLimitHit 플래그를 통해 탐색 중단 상태를 기록하는 로직 구현
  • allCycles.length === 0 조건에 !depthLimitHit를 추가하여 완전 탐색이 완료된 경우에만 캐싱하도록 제어
  • 잘못된 Acyclic 판단이 하위 SCC(Strongly Connected Components) 트리 전체로 전파되는 Cache Poisoning 현상 차단
  • 단순 근사치 기반의 DFS 대신 Tarjan's Algorithm을 활용한 SCC 그래프 구축 방식의 정확성 검토
  • 소규모 유닛 테스트가 아닌 실제 프로덕션 규모(14K+ 파일)의 스트레스 테스트를 통한 검증 체계 강화

1. DFS/BFS 구현 시 Depth Limit 도입 여부와 그에 따른 예외 처리 및 캐싱 전략의 정합성을 검토할 것

2. 알고리즘의 정밀도가 중요한 경우 근사치 기반의 캐싱보다 SCC와 같은 Exact Algorithm 도입을 우선 고려할 것

3. 캐시 전파(Cascade) 효과가 발생하는 시스템은 프로덕션 수준의 대규모 데이터셋으로 엣지 케이스를 검증할 것

원문 읽기