ilokesto

구독

옵저버 생명주기 관리 및 알림 보장입니다.

@ilokesto/store의 구독 시스템은 가볍고 신뢰할 수 있도록 설계되었습니다.

구독/구독 취소 생명주기 (Subscribe/Unsubscribe Lifecycle)

store.subscribe는 리스너를 등록하고 구독 취소 함수를 반환합니다. 메모리 누수를 방지하기 위해 컨슈머(예: 컴포넌트나 서비스)가 파괴될 때 항상 이 함수를 호출하십시오.

const unsubscribe = store.subscribe(() => {
  // 상태 변경에 응답
});

// 완료 시 정리
unsubscribe();

동기식 알림 (Synchronous Notification)

알림은 동기적으로 이루어집니다. store.setState가 호출되고 참조 검사를 통과하면 내부 상태가 업데이트되고, 즉시 모든 리스너에게 알림이 갑니다.

  • 알림은 setState 콜 스택 내에서 발생합니다.
  • 리스너는 방금 적용된 상태를 즉시 보게 됩니다.

중복 리스너 등록

같은 리스너 참조는 한 번만 등록하는 편이 좋습니다. 구독 동작은 동일한 콜백을 여러 번 쌓는 용도보다, 안정적인 리스너 등록과 예측 가능한 정리를 위한 용도로 이해하는 것이 맞습니다.

안전한 알림 순회 (Safe Notification Iteration)

알림 단계 중에 리스너가 자기 자신이나 다른 리스너의 구독을 취소하더라도, 알림 동작은 안전하게 유지됩니다. 소비자 입장에서는 그 보장을 신뢰하면 되고, 내부 순회 방식 자체에 의존할 필요는 없습니다.

const unsubscribeSelf = store.subscribe(() => {
  // 이는 안전하며 루프를 깨뜨리지 않습니다
  unsubscribeSelf();
});

일반적인 사용 패턴

  • 로깅: 모든 전환을 기록하는 스토어 범위의 로거.
  • 퍼시스턴스(Persistence): 모든 변경 시 상태를 localStorage에 저장하는 리스너.
  • 프레임워크 어댑터: 스토어가 알림을 보낼 때마다 React나 Vue에서 리렌더링을 트리거하는 접착 코트(glue code).

베스트 프랙티스

  • 가볍게 유지하십시오: 리스너는 빨라야 하며 무거운 계산을 피해야 합니다. 복잡한 처리가 필요한 경우 알림 주기 밖에서 작업을 디바운싱하거나 예약하는 것을 고려하십시오.
  • 리스너 내부의 사이드 이펙트 방지: 이상적으로 리스너는 하류(downstream) 업데이트를 트리거하거나 변경 사항을 기록하기만 해야 합니다. 리스너 내부에서 store.setState를 호출하면 무한 업데이트 루프가 발생할 수 있으므로 피하십시오.

목차