talkDOM: DOM을 위한 작은 메시지 전달 런타임

발행: (2026년 3월 7일 PM 10:33 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

현대 프론트엔드 개발

현대 프론트엔드 개발은 종종 인터랙티브한 웹 인터페이스를 구축하려면 무거운 JavaScript 프레임워크가 필요하다고 가정합니다. 수년 동안 프레임워크는 점점 복잡해져서 컴포넌트, 상태 관리 시스템, 빌드 파이프라인, 그리고 큰 런타임 번들을 도입했습니다.

talkDOM은 웹이 이미 강력한 플랫폼을 가지고 있음을 보여줍니다: HTML + DOM + HTTP.

Repository:

핵심 아이디어

talkDOM에서는 요소들이 Smalltalk‑style 메시지를 사용해 통신합니다.

보내는 요소는 sender 속성을 가집니다:

<button sender="posts get:/posts | list apply:inner">
  Load Posts
</button>

받는 요소는 자신이 받을 수 있는 것을 선언합니다:

<div receiver="list"></div>

버튼을 클릭하면:

  1. posts에 메시지가 전송됩니다.
  2. GET /posts 요청이 수행됩니다.
  3. 응답이 list로 파이프됩니다.
  4. 리스트의 내용이 교체됩니다.

메시지 문자열

posts get:/posts | list apply:inner

은 거의 문장처럼 읽힙니다:

“Posts, /posts를 가져오고, 그 다음 리스트에 결과를 inner 콘텐츠로 적용해라.”

메시지 파이프라인

여러 작업을 파이프 연산자 | 로 구성할 수 있습니다:

<button sender="posts get:/posts | list apply:inner">
  Load Posts
</button>

각 단계는 값(또는 프라미스)을 반환할 수 있으며, 그 값은 다음 단계로 전달됩니다.
이 디자인은 다음에서 영감을 받았습니다:

  • Unix 파이프
  • Smalltalk 키워드 메시지
  • 일반 메시지‑패싱 시스템

파이프라인을 사용하면 복잡한 UI 동작을 놀라울 정도로 적은 코드로 표현할 수 있습니다.

Receivers

수신기receiver 속성을 가진 모든 DOM 요소를 의미합니다:

<div receiver="toast"></div>

Multiple Groups

<div receiver="toast" group="info"></div>
<div receiver="toast" group="error"></div>

toast에 전송된 메시지는 모든 일치하는 요소를 대상으로 합니다.

Accepted Operations

<div receiver="list" accepts="inner,append"></div>

accepts 목록은 수신기가 수행할 수 있는 작업을 제한함으로써 작은 안전 계층을 추가합니다.

콘텐츠 가져오기 및 업데이트

talkDOM은 HTTP 요청 및 DOM 업데이트를 위한 내장 메서드를 제공합니다.

<button sender="load get:/data | target apply:inner">
  Load
</button>

지원되는 요청 메서드

  • get:
  • post:
  • put:
  • delete:

업데이트 작업

  • innerinnerHTML을 교체
  • append – 기존 콘텐츠에 추가
  • texttextContent를 교체
  • outer – 요소 자체를 교체

서버‑트리거 액션

서버는 응답 헤더 X‑TalkDOM‑Trigger 를 통해 클라이언트‑측 동작을 트리거할 수 있습니다.

예시 헤더:

X-TalkDOM-Trigger: toast apply:"Saved!" text

서버는 JavaScript를 삽입하지 않고도 클라이언트가 UI 요소를 업데이트하도록 지시할 수 있습니다.

폴링

수신기는 엔드포인트를 자동으로 폴링할 수 있습니다:

<div receiver="posts" poll="/posts" interval="5000"></div>

이것은 /posts5 초마다 가져와서 수신기를 업데이트합니다. 요소가 DOM에서 제거되면 폴링이 자동으로 중지됩니다.

탐색 및 기록

talkDOM은 히스토리 인식 네비게이션을 지원합니다:

<a href="/posts" sender="posts get:/posts | list apply:inner" history>
  Posts
</a>

클릭했을 때:

  1. 요청이 실행됩니다.
  2. 콘텐츠가 업데이트됩니다.
  3. URL이 브라우저 히스토리에 푸시됩니다.

뒤로/앞으로 이동하면 동일한 메시지 체인이 재생됩니다.

지속성

Receivers can persist their content in localStorage:

<div receiver="profile" persist-key="profile-data"></div>

After a page reload, the content is restored automatically.

이벤트

talkDOM은 작업 후 라이프사이클 이벤트를 발생시킵니다:

  • talkdom:done – 작업이 성공적으로 완료됨
  • talkdom:error – 작업이 실패함
document.addEventListener("talkdom:done", e => {
  console.log("operation finished", e.detail);
});

이러한 이벤트를 통해 필요할 때 런타임에 쉽게 연결할 수 있습니다.

왜 이것을 만들까?

HTMX, Unpoly, Turbo와 같은 프로젝트들은 대규모 프런트엔드 프레임워크 없이도 많은 인터랙티브 인터페이스를 구축할 수 있음을 보여주었습니다. talkDOM은 약간 다른 방향을 탐구합니다.

속성 기반 API 대신:

hx-get="/posts"
hx-target="#list"
hx-swap="inner"

talkDOM은 메시지 구문을 사용합니다:

posts get:/posts apply:inner

이렇게 하면 상호작용이:

  • Composable구성 가능
  • Pipeline‑friendly파이프라인 친화적
  • Closer to a programming language프로그래밍 언어에 더 가깝게

HTML은 UI 동작을 위한 작은 DSL이 됩니다.

디자인 목표

  • 작은 런타임 (몇 킬로바이트에 불과)
  • 빌드 단계 없음 – 스크립트를 삽입하고 바로 사용
  • 점진적 향상 – 모든 최신 브라우저에서 작동
  • 파이프라인을 통한 구성 가능한 상호작용
  • 최소한의 JavaScript – 대부분의 로직은 HTML에 존재

전체 런타임은 단일하고 가벼운 스크립트 하나이며, 이를 어떤 페이지에도 추가할 수 있습니다.

이것이 무엇이며 (그리고 무엇이 아닌가)

talkDOM은 전체 UI 프레임워크를 대체하려는 것이 아닙니다.

다음에 가장 적합합니다:

  • 서버‑렌더링 애플리케이션
  • 대시보드
  • 관리자 패널
  • 점진적으로 향상된 페이지

여기서 서버가 주요 진실 소스입니다.

마무리 생각

웹은 이미 강력한 프로그래밍 모델을 제공합니다:

  • 문서
  • 이벤트
  • HTTP
  • DOM

때때로 최고의 도구는 또 다른 추상화 레이어가 아니라 플랫폼이 스스로 말하도록 하는 작은 런타임입니다.

talkDOM은 그 방향의 실험으로, HTML을 인터랙티브 인터페이스를 구축하기 위한 작은 메시지‑전달 언어로 변환합니다.

프로젝트는 GitHub에서 확인할 수 있습니다:

https://github.com/eringen/talkdom

0 조회
Back to Blog

관련 글

더 보기 »

주간 챌린지 #2 : ME를 챌린지로 만들기

미션 다음에 내가 완료해야 할 프론트‑엔드 챌린지를 생각해 내라. 그것은 다음과 같을 수 있다: - 이상한 - 영리한 - 저주받은 - 매우 간단한 - 혹은 “누가 이런 걸 할까…”