: 함수와 그 함수가 선언될 때의 렉시컬 환경(외부 변수 스코프)을 함께 기억하는 개념
✅ 즉, 함수 안에서 외부 변수에 접근하고, 그 상태를 유지할 수 있는 기능
: 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고, 자동으로 내용이 갱신되는 방식으로, 일대다 의존성을 정의한다.
✅ 구현 방법에는 여러가지가 있지만, 대부분 주제와 옵저버 인터페이스가 들어있는 클래스 디자인으로 한다.
: 애플리케이션 전체에서 단 하나만 존재하는 인스턴스
✅ 전역적으로 공유되며, 여러곳에서 같은 상태를 사용해야 할 때 유용하다.
import { ref, onUnmounted } from 'vue';
import { useRouter } from 'vue-router';
import { createSlowNetworkMonitor, SlowNetworkStatus } from '@/utils/slowNetworkMonitor';
// 전역에 선언 -> 앱 전체에 공유되는 변수
let slowNetworkMonitor: ReturnType<typeof createSlowNetworkMonitor> | null = null;
let subscriberCount = 0;
export function useSlowNetworkMonitor() {
const router = useRouter();
const isSlowNetwork = ref(false);
const latency = ref(0);
// 전역에서 단 하나 -> 싱글톤
if (!slowNetworkMonitor) {
slowNetworkMonitor = createSlowNetworkMonitor({
threshold: 500,
interval: 60000,
autoPulling: true,
});
}
// 구독자 수 체크
subscriberCount++;
// 구독 취소 시
const unsubscribe = slowNetworkMonitor.onChange((status: SlowNetworkStatus) => {
isSlowNetwork.value = status.isSlowNetwork;
latency.value = status.latency;
if (status.isSlowNetwork) {
router.replace('/errors/network-error');
}
});
onUnmounted(() => {
unsubscribe();
subscriberCount--;
if (subscriberCount === 0 && slowNetworkMonitor) {
slowNetworkMonitor.destroy();
slowNetworkMonitor = null;
}
});
return {
isSlowNetwork,
latency,
};
}