더북(TheBook)

3.1.1 즉시 할당의 단점

RxJS를 다룰 때 꼭 기억해야 할 점은 스트림의 수명이 옵저버블의 생성에서 시작하지 않는다는 겁니다. 그 수명은 옵저버블이 구독될 때 시작됩니다. 따라서 스트림은 휴면 상태로 시작하며 옵저버가 구독하지 않으면 이벤트를 생성하거나 방출하지 않기 때문에 스트림을 생성하고 초기화하는 데 약간의 오버헤드가 발생합니다. 이는 “애플리케이션이 옵저버블을 생성했는데 아무도 그 옵저버블을 구독하지 않으면 이벤트를 방출할까요?”라는 말과 유사합니다.

필요할 때만 데이터를 만드는 객체를 컴퓨팅 용어로 지연 데이터 소스(lazy data source)라고 하며, 엄격히 즉시 평가(eager evaluation)를 적용하는 자바스크립트와는 대조적입니다. 즉시지연은 애플리케이션이 시스템에 언제 얼마나 많은 메모리를 요청하는지를 나타냅니다. 지연 할당은 공간이 실제로 필요할 때(또는 필요에 따라) 이루어지지만, 즉시 할당은 객체 범위가 지정되는 즉시 우선으로 이루어집니다. 즉시 할당에서는 얼마나 많은 공간이 사용될지 모르기 때문에 할당하는 데 드는 선지급 비용이 있으며 초과 할당될 가능성이 있습니다. 반면에 지연 할당은 공간이 필요할 때까지 기다렸다가 런타임 때 할당 페널티를 지불합니다. 이렇게 하면 프레임워크가 깔끔해지고 특정 상황에서 공간을 초과 할당하는 일을 피할 수 있습니다. 그 차이점을 알아보고자 인기 있는 자바스크립트 배열 메서드인 slice()가 즉시 평가와 지연 평가에서 어떻게 작동하는지 살펴보겠습니다. range(start, end)라는 함수를 생각해 봅시다. 그림 3-1을 보면 무한한 수의 요소를 생성하고 처음 5개를 취합니다.

▲ 그림 3-1 즉시 할당 방식에서는 메모리 부족으로 slice(5) 함수가 실행되기 전에 프로그램이 중지된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.