라떼군 뉴스


FinalizationRegistry는 왜 위험한가? Cloudflare의 실전 교훈

이 글은 다음 링크를 참고하여 인사이트를 더한 것입니다. 원문은 해당 링크에서 확인해주세요: https://blog.cloudflare.com/we-shipped-finalizationregistry-in-workers-why-you-should-never-use-it/↗

메모리 관리, 이제는 운에 맡기지 마세요 Cloudflare는 최근 자사 Workers 환경에 FinalizationRegistry를 도입했습니다. 이는 JS 객체가 가비지 컬렉션 될 때 콜백을 실행할 수 있게 해주는 API입니다. 하지만 Cloudflare는 이 기능을 도입하면서도 “쓰지 마세요”라고 경고합니다.

왜일까요? 그 이유는 명확합니다. FinalizationRegistry는 **비결정적(non-deterministic)**입니다. GC 시점은 예측할 수 없고, 최악의 경우 아예 콜백이 호출되지 않을 수도 있습니다. 이런 불확실성은 WebAssembly처럼 수동 메모리 관리가 필수인 환경에서 위험한 결과를 초래합니다.

Cloudflare는 대안으로 **Explicit Resource Management(ERM)**을 제시합니다. C#의 using, Python의 with처럼 JS에서도 using 문법과 Symbol.dispose를 통해 명시적이고 결정적인 리소스 해제가 가능해졌습니다.

핵심 요약:

  • WebAssembly는 수동 메모리 관리 필요 (Rust 예제 포함)
  • FinalizationRegistry는 안전망 정도로만 사용해야 함
  • 가비지 콜렉터의 타이밍에 의존하는 로직은 절대 금물
  • Cloudflare는 이 API에 I/O 차단 등 안전장치도 도입
  • Explicit Resource Management가 미래이며, 점차 표준으로 채택 중

결론적으로, FinalizationRegistry는 ‘혹시 모를 상황’을 대비한 최후의 보루일 뿐, 실전에서는 using 기반의 명시적 클린업이 메모리 안정성과 성능을 모두 잡는 해법입니다.