ilokesto

시맨틱

@ilokesto/store에 대한 엄격한 동작 사양입니다.

이 페이지는 Store 클래스에 대한 공식적인 동작 사양을 다룹니다.

Readonly<T>의 의미

Store 클래스는 메서드 시그니처(getState, getInitialState 등)에서 Readonly<T>를 사용합니다.

  • 컴파일 타임 안전성: 타입스크립트에서 실수로 발생하는 직접적인 수정을 방지합니다.
  • 계약상의 의도: 반환된 상태가 정적인 스냅샷이며 수정되어서는 안 된다는 신호를 컨슈머에게 전달합니다.
  • 런타임 동결 없음: 성능상의 이유로, 스토어는 런타임에 상태에 대해 Object.freeze()를 호출하지 않습니다.

동기식 모델 (Synchronous Model)

스토어는 엄격하게 동기적인 모델로 작동합니다.

  • setState는 현재 업데이트 흐름이 끝나고 그 업데이트에 대한 모든 리스너 알림이 전달된 후에만 완료됩니다.
  • 내부적인 배치(batching)나 스케줄링은 없습니다. 비동기 동작이 필요한 경우, 상위 수준(예: 어댑터)에서 관리해야 합니다.

동등성 및 베일아웃 (Equality and Bailout)

Store는 상태 비교를 위해 Object.is를 사용합니다.

  • 베일아웃: Object.is(prevState, nextState)true이면 업데이트가 발생하지 않습니다.
  • 참조 인식: 객체나 배열의 업데이트를 트리거하려면 반드시 새로운 참조를 제공해야 합니다.

스토어가 하지 않는 것

"기초적인(foundational)" 패키지로 남기 위해, Store는 의도적으로 다음을 피합니다:

  • 얕은 병합(Shallow Merging): setState는 항상 전체 상태를 교체합니다.
  • 깊은 관찰 가능성(Deep Observability): Proxy를 사용하거나 속성 수준의 접근을 추적하지 않습니다.
  • 액션 디스패칭: 내장된 dispatch나 리듀서 로직이 없습니다.
  • 의존성 추적: 리스너가 상태의 어느 부분에 관심이 있는지 알지 못하며, 모든 변경에 대해 알림을 보냅니다.

불변 스냅샷 사고방식 (Immutable Snapshot Mindset)

@ilokesto/store의 핵심 철학은 특정 시점의 상태가 불변의 스냅샷이라는 것입니다. 스냅샷 간의 전환은 명시적이고, 원자적이며, 동기적으로 이루어집니다.

요약 규칙

  1. 항상 새로운 참조를 반환하여 원시 타입이 아닌 상태의 업데이트를 트리거하십시오.
  2. getState()가 반환한 객체를 절대 수정하지 마십시오.
  3. 알림이 즉시 동기적으로 전달된다고 가정하십시오.
  4. 이전 상태에 의존하는 로직에는 업데이트 함수를 사용하십시오.

목차