시맨틱
@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의 핵심 철학은 특정 시점의 상태가 불변의 스냅샷이라는 것입니다. 스냅샷 간의 전환은 명시적이고, 원자적이며, 동기적으로 이루어집니다.
요약 규칙
- 항상 새로운 참조를 반환하여 원시 타입이 아닌 상태의 업데이트를 트리거하십시오.
getState()가 반환한 객체를 절대 수정하지 마십시오.- 알림이 즉시 동기적으로 전달된다고 가정하십시오.
- 이전 상태에 의존하는 로직에는 업데이트 함수를 사용하십시오.