자바스크립트는 계속 진화하고 있습니다. TC39에서 논의 중인 Signals, Pattern Matching, Type Annotations는 자바스크립트의 패러다임을 바꿀 수 있는 중요한 제안들입니다. 아직 표준은 아니지만, 미래를 미리 준비하는 차원에서 핵심 개념을 살펴보겠습니다.

Signals — 리액티브 프리미티브

Signals는 반응형 상태 관리 의 표준을 만들려는 제안입니다. React, Vue, Solid, Angular 등의 프레임워크가 각각 다른 방식으로 구현하고 있는 "반응형 값"을 언어 차원에서 통일하려는 시도입니다.

왜 Signals가 필요한가?

JS
// 현재: 프레임워크마다 다른 반응형 시스템
// React: useState, useMemo
// Vue: ref, computed
// Solid: createSignal, createMemo
// Angular: signal, computed

// 미래: 표준 Signal API
const count = new Signal.State(0);
const doubled = new Signal.Computed(() => count.get() * 2);

Signal API 초안

JS
// State Signal — 읽고 쓸 수 있는 반응형 값
const name = new Signal.State("정훈");
console.log(name.get()); // "정훈"
name.set("길동");
console.log(name.get()); // "길동"

// Computed Signal — 의존성 자동 추적
const greeting = new Signal.Computed(() => {
  return `안녕, ${name.get()}!`; // name에 자동 의존
});

console.log(greeting.get()); // "안녕, 길동!"
name.set("순신");
console.log(greeting.get()); // "안녕, 순신!" — 자동 업데이트

// Watcher — 변경 감지
const watcher = new Signal.subtle.Watcher(() => {
  console.log("값이 변경됨!");
});
watcher.watch(name);

프레임워크에 미치는 영향

JS
// 표준 Signal이 도입되면:
// 1. 프레임워크 간 상태 공유가 자연스러워짐
// 2. 라이브러리가 프레임워크에 독립적으로 반응형 상태 제공
// 3. 번들 크기 감소 (반응형 시스템을 브라우저가 내장)

// 현재도 Preact, Solid, Angular 등이 Signal 기반
// TC39 제안이 통과되면 표준이 됨

Pattern Matching — 강력한 조건 분기

switch문의 상위 호환으로, 복잡한 데이터 구조를 우아하게 분기 처리합니다.

JS
// 현재: switch나 if-else 체인
function describe(value) {
  if (value === null) return "null";
  if (Array.isArray(value)) return `배열(${value.length}개)`;
  if (typeof value === "object") return "객체";
  return typeof value;
}

// Pattern Matching 제안
const result = match (value) {
  when (null): "null";
  when (Number): `숫자: ${value}`;
  when (String): `문자열: "${value}"`;
  when ([_, _, _]): "3개 요소 배열";
  when ({ name: String, age: Number }):
    `${value.name} (${value.age}세)`;
  default: "알 수 없는 타입";
};

구조 분해와 가드

JS
// 중첩 패턴
const message = match (response) {
  when ({ status: 200, data: { users: [...users] } }):
    `${users.length}명의 사용자`;
  when ({ status: 404 }):
    "페이지를 찾을 수 없습니다";
  when ({ status: Number and (>= 500) }):
    "서버 에러";
  default:
    "알 수 없는 응답";
};

// Redux 리듀서에 적용하면
function reducer(state, action) {
  return match (action) {
    when ({ type: "INCREMENT" }):
      { ...state, count: state.count + 1 };
    when ({ type: "SET_NAME", payload: String }):
      { ...state, name: action.payload };
    default:
      state;
  };
}

Type Annotations — 타입 주석

TypeScript의 타입 구문을 자바스크립트에서 주석으로 사용할 수 있게 하는 제안입니다. 런타임에서는 무시되지만, 도구(IDE, 린터)가 활용합니다.

JS
// 현재: JSDoc으로 타입 힌트
/** @param {string} name */
/** @param {number} age */
/** @returns {string} */
function greet(name, age) {
  return `${name}님은 ${age}세입니다.`;
}

// Type Annotations 제안
function greet(name: string, age: number): string {
  return `${name}님은 ${age}세입니다.`;
}
// → 자바스크립트 엔진이 : string 등을 무시 (주석 취급)
// → TypeScript 없이도 타입 도구의 혜택을 받을 수 있음

중요한 점

JS
// 이 제안은 타입 "검사"를 추가하는 것이 아님!
// 엔진이 타입을 무시하므로 런타임 에러는 여전히 발생

function add(a: number, b: number): number {
  return a + b;
}

add("hello", "world"); // 런타임에서 에러 없이 "helloworld" 반환
// → 타입 검사는 여전히 TypeScript나 도구가 담당

기타 주목할 제안들

Explicit Resource Management (using)

JS
// 리소스 자동 정리 (Stage 3)
{
  using file = openFile("data.txt");
  const content = file.read();
  // 블록을 벗어나면 file[Symbol.dispose]() 자동 호출
}
// file이 자동으로 닫힘 — try-finally 불필요

// 비동기 버전
{
  await using db = await connectDB();
  const data = await db.query("SELECT * FROM users");
}
// db가 자동으로 연결 종료

Import Attributes

JS
// JSON 모듈 임포트 (Stage 3)
import data from "./data.json" with { type: "json" };

// CSS 모듈
import styles from "./styles.css" with { type: "css" };

Async Iterator Helpers

JS
// 비동기 이터레이터에도 map, filter 사용 가능
const results = await asyncIterator
  .filter((item) => item.active)
  .map((item) => item.name)
  .take(10)
  .toArray();

지금 준비할 수 있는 것

JS
// 1. Signals — Preact Signals, SolidJS Signal 사용해보기
import { signal, computed, effect } from "@preact/signals";

const count = signal(0);
const doubled = computed(() => count.value * 2);

// 2. Pattern Matching — ts-pattern 라이브러리
import { match, P } from "ts-pattern";

const result = match(response)
  .with({ status: 200, data: P.select() }, (data) => `성공: ${data}`)
  .with({ status: 404 }, () => "없음")
  .otherwise(() => "기타");

// 3. Type Annotations — TypeScript 또는 JSDoc 사용

로드맵 요약

제안Stage예상 시기
SignalsStage 1미정
Pattern MatchingStage 1미정
Type AnnotationsStage 1미정
Explicit Resource ManagementStage 3
Import AttributesStage 3
DecoratorsStage 3

**기억하기 **: Signals는 프레임워크 간 반응형 상태의 통일, Pattern Matching은 강력한 조건 분기, Type Annotations는 TypeScript 없이 타입 힌트를 위한 제안입니다. 아직 초기 단계이지만, 이 방향을 이해하고 있으면 자바스크립트 생태계의 흐름을 파악하는 데 도움이 됩니다.

댓글 로딩 중...