-
Explicit Resource Management 제안은 파일 핸들, 네트워크 연결 등 리소스의 라이프사이클을 명확하게 제어하는 새로운 방법
- Chromium 134와 V8 v13.8부터 해당 기능을 이용할 수 있음
- 언어에 추가 되는 부분들
-
using 및 await using 선언과 Symbol.dispose, Symbol.asyncDispose 심볼 도입으로 자동 정리 메커니즘을 제공
-
DisposableStack, AsyncDisposableStack은 여러 리소스를 안전하게 그룹화하고 해제
-
SuppressedError는 정리 중 발생한 오류와 기존 오류를 함께 관리함
- 이 방법은 코드 안전성과 유지보수성을 크게 올려주며, 리소스 누수 방지에 효과적임
- 기존 try...finally 패턴을 단순화하고, 대규모 복합 리소스 환경에서 신뢰성 높은 자원 처리가 가능해짐
명시적 리소스 관리 제안 개요
-
Explicit Resource Management 제안은 파일 핸들, 네트워크 연결 등의 리소스를 명확하게 생성‧해제할 수 있는 새로운 방법을 도입함
- 주요 구성요소는 다음과 같음
-
using 및 await using 선언: 스코프 종료 시 자동으로 리소스 해제
-
[Symbol.dispose](), [Symbol.asyncDispose]() 심볼: 해제(cleanup) 동작 구현을 위한 메서드
- 글로벌 객체 DisposableStack, AsyncDisposableStack: 여러 리소스를 그룹화해 효율적으로 관리
-
SuppressedError: 리소스 정리 중 발생한 에러와 기존 에러 모두를 포함하는 신규 에러 타입
- 이 기능들은 개발자가 세밀하게 리소스를 관리하고, 코드의 성능과 안전성을 향상시키는 데 초점을 맞춤
using과 await using 선언
-
using 선언은 동기 리소스에, await using 선언은 비동기 리소스에 사용함
- 선언된 리소스는 스코프를 벗어날 때 자동으로 Symbol.dispose 또는 Symbol.asyncDispose 가 호출됨
- 이를 통해 동기/비동기 리소스 누수 문제를 줄이고, 일관된 해제 코드를 작성할 수 있음
- 이 키워드는 코드 블록, for 루프, 함수 바디 내에서만 사용할 수 있고, 최상위 레벨에서는 사용할 수 없음
- 예시
- 예를 들어, ReadableStreamDefaultReader를 사용할 때, reader.releaseLock()을 반드시 호출해야 스트림을 재활용할 수 있음
- 오류 발생 시, 이 호출이 누락되면 스트림이 영구적으로 잠기는 문제가 발생함
- 전통적인 방식
- 개발자는 try...finally 블록을 사용하여 리더의 잠금 해제를 보장함
- finally 블록에 reader.releaseLock() 코드 작성이 필요함
-
개선된 방식: using 도입
- 해제 동작을 포함하는 디스포저블 객체(readerResource)를 생성
-
using readerResource = {...} 패턴을 사용하면 코드 블록 탈출 즉시 자동으로 해제됨
- 향후 웹 API에서 [Symbol.dispose] 및 [Symbol.asyncDispose] 지원 시, 별도 래퍼 객체 작성 없이 자동 관리 가능성이 있음
DisposableStack과 AsyncDisposableStack
- 여러 리소스를 효율적이고 안전하게 그룹화하도록 DisposableStack과 AsyncDisposableStack이 도입됨
- 각 스택에 리소스를 추가하고, 스택 자체를 해제할 때 내부 모든 리소스를 역순으로 해제함
- 의존 관계가 있는 복잡한 리소스 집합을 다룰 때 위험을 줄이고 코드를 단순화함
-
주요 메서드
-
use(value): 스택 맨 위에 디스포저블 리소스를 추가함
-
adopt(value, onDispose): 비디스포저블 리소스에 해제 콜백을 묶어 추가함
-
defer(onDispose): 리소스 없이 해제 동작만 추가함
-
move(): 현재 스택의 모든 리소스를 새 스택으로 이동시켜 소유권 이전 가능함
-
dispose(), asyncDispose(): 스택 내 리소스 전체를 해제함
지원 현황 및 활용 가능 시점
-
Chromium 134, V8 v13.8 이상에서 명시적 리소스 관리 기능 이용 가능함
- 향후 다양한 웹 API와 호환 확대 기대감이 있음