[typescript] 타입스크립트의 가바지 컬렉션 이슈 대응 방법

가비지 컬렉션(garbage collection)은 메모리에서 더 이상 사용되지 않는 객체를 식별하고 해제하여 자원을 확보하는 프로세스입니다. 타입스크립트에서 가비지 컬렉션은 자동적으로 이루어지지만, 때때로 메모리 누수와 같은 이슈가 발생할 수 있습니다.

가비지 컬렉션 이슈의 원인

가비지 컬렉션 이슈의 주된 원인은 순환 참조(circular references)입니다. 이는 객체 간에 서로 참조가 일어나며, 이때 모든 참조가 끊어지지 않으면 가비지 컬렉터는 해당 객체를 해제하지 못하게 됩니다. 결과적으로 해당 객체들은 메모리에 계속 남아 메모리 누수를 일으킬 수 있습니다.

가비지 컬렉션 이슈 대응

타입스크립트에서 가비지 컬렉션 이슈를 해결하기 위해 WeakMap을 사용할 수 있습니다. WeakMap은 약한 참조(weak reference)만을 가지고 있는 컬렉션으로, 객체 간 순환 참조를 방지할 수 있습니다.

다음은 WeakMap의 사용 예시입니다:

let wm = new WeakMap();
let key1 = {};
let obj1 = { data: 'some data' };

wm.set(key1, obj1);

// later, obj1 is no longer needed

key1 = null; // Remove the only reference to obj1

위 예시에서 obj1은 더 이상 필요하지 않을 때 key1null로 설정함으로써 참조를 끊어 WeakMap에서 제거할 수 있습니다.

또한, 순환 참조를 완전히 피할 수 없을 경우, 다음 두 가지 방법을 고려할 수 있습니다:

  1. 의도적인 해제: 객체를 더 이상 사용하지 않을 때 명시적으로 해당 객체를 null로 설정하여 참조를 끊음으로써 가비지 컬렉터가 이를 감지하고 객체를 해제할 수 있도록 하는 방법입니다.
  2. 메모리 사용 파악: 순환 참조를 최소화하고 필요 없는 객체를 즉시 null로 설정하여 메모리 누수를 방지하는 것이 중요합니다.

결론

가비지 컬렉션 이슈는 언어나 환경에 따라 다르지만, 타입스크립트에서는 WeakMap과 함께 순환 참조를 주의깊게 관리함으로써 메모리 누수를 효과적으로 방지할 수 있습니다. 순환 참조가 불가피한 경우에는 명시적인 객체 해제와 메모리 사용 파악을 통해 이를 관리할 수 있습니다.

참고 문헌: