TC39 Signals는 "시그널(반응형 상태)"을 자바스크립트 언어 표준으로 넣자는 제안이다. 지금은 React·Vue·Svelte·Solid·Angular가 각자 반응성 엔진을 따로 구현하는데, 그 공통 뼈대를 언어 차원에 두어 프레임워크들이 같은 기반 위에서 상호운용하도록 만드는 것이 목표다.
솔직히 처음 이 제안을 봤을 때 "또 표준화 만능주의인가" 싶었다. 그런데 뜯어보니, 프레임워크들이 이미 같은 개념을 미묘하게 다르게 재발명하고 있다는 지적이 꽤 설득력 있었다.
시그널이 뭔데
시그널은 값을 담는 상자인데, 누가 자기를 읽는지 스스로 추적한다. 값이 바뀌면 자기에게 의존하던 계산과 이펙트만 골라서 다시 돌린다. 리렌더로 트리 전체를 훑는 대신, 바뀐 값과 실제로 연결된 부분만 갱신하는 "세밀한 반응성(fine-grained reactivity)"의 핵심 단위다. Solid의 createSignal, Vue의 ref, Angular의 signal이 다 같은 아이디어다.
제안된 API 맛보기
제안은 Signal.State(쓰기 가능한 상태)와 Signal.Computed(파생 값) 두 축을 둔다.
import { Signal } from 'signal-polyfill'
const count = new Signal.State(0)
const double = new Signal.Computed(() => count.get() * 2)
console.log(double.get()) // 0
count.set(5)
console.log(double.get()) // 10 ← 자동 재계산
중요한 설계 결정 하나. 제안은 이펙트(effect)를 언어에 넣지 않는다. 언제 화면을 다시 그릴지, 마이크로태스크로 묶을지 같은 스케줄링은 프레임워크마다 정책이 다르기 때문에, 저수준 Signal.subtle.Watcher만 제공하고 그 위 스케줄링은 각자 알아서 얹게 한다.
const w = new Signal.subtle.Watcher(() => {
queueMicrotask(flush) // 언제 반영할지는 내가 정한다
})
w.watch(double)
왜 언어 표준이어야 하나
- 상호운용. 라이브러리(예: 데이터 페칭·폼 상태)를 특정 프레임워크에 묶지 않고, 표준 시그널로 노출하면 어디서든 소비할 수 있다.
- 중복 제거. 각 프레임워크가 반응성 엔진을 유지·최적화하는 부담을 언어 런타임이 나눠 진다.
- 학습 전이. 개념을 한 번 익히면 프레임워크를 옮겨도 통한다.
다만 오해는 말자. 이건 "React를 대체한다"거나 "가상 DOM이 끝난다"는 얘기가 아니다. 반응성의 공통 원자를 표준화하려는 것이지, 렌더링 방식이나 컴포넌트 모델을 규정하지 않는다.
지금 상태와 현실적 태도
| 항목 | 현황 |
|---|---|
| 표준화 단계 | TC39 초기 단계(프로포절) |
| 지금 쓰는 법 | 공식 signal-polyfill |
| 프로덕션 권장 | 아직 실험용, 스펙 변동 가능 |
| 참여 진영 | 여러 프레임워크 관계자 협업 |
표준화는 느리다. 이 제안이 정식 스펙으로 안착하기까지 시간이 더 걸릴 테고, API도 바뀔 수 있다. 그래서 나는 "당장 프로덕션에 넣자"보다는 "폴리필로 감을 익혀두자"는 쪽이다. 개념 자체는 이미 Solid·Vue·Angular로 검증됐으니, 지금 시그널식 사고에 익숙해지는 건 어느 쪽이든 남는 장사다.
자주 묻는 질문
지금 프로젝트에 바로 도입해도 되나요?
표준이 확정되기 전이라 프로덕션엔 권하지 않습니다. 학습·프로토타이핑 용도로 signal-polyfill을 써보는 정도가 적절합니다. 실무 반응성은 사용 중인 프레임워크의 기본 기능을 쓰세요.
React도 시그널로 바뀌나요?
React는 리렌더 기반 모델과 컴파일러(자동 메모이제이션) 방향을 택하고 있어, 표준 시그널을 코어 상태 모델로 채택할지는 미지수입니다. 다만 표준이 생기면 상호운용 계층으로 활용될 여지는 있습니다.
이펙트가 스펙에 없다는 게 무슨 의미인가요?
값 변화에 반응해 "언제, 어떻게" 부수효과를 실행할지는 프레임워크마다 정책이 달라, 표준은 저수준 Watcher만 제공하고 스케줄링은 상위 계층에 위임한다는 뜻입니다.
세밀한 반응성이 항상 가상 DOM보다 빠른가요?
업데이트 지역성이 좋아 대체로 갱신 비용이 낮지만, 만능은 아닙니다. 앱 구조·업데이트 패턴에 따라 다르며, 개발 경험과 생태계까지 함께 보고 선택할 문제입니다.

댓글 0