Turbo Stream: 폼 제출 및 응답 처리 방식 상세 분석

How does Turbo listen for Turbo Streams?

작성자
발행일
2025년 10월 07일

핵심 요약

  • 1 Turbo는 폼 제출을 가로채 `Accept: text/vnd.turbo-stream.html` 헤더를 추가하여 서버에 Turbo Stream 응답을 요청합니다.
  • 2 서버가 `Content-Type: text/vnd.turbo-stream.html`로 응답하면, Turbo는 해당 Turbo Stream 요소를 DOM에 추가하여 정의된 액션(append, prepend 등)을 자동으로 실행합니다.
  • 3 성공적인 Turbo Stream 폼 제출 후 일반 HTML 응답을 원할 경우, Turbo는 리다이렉션을 요구하며, 그렇지 않으면 오류를 발생시킵니다.

도입

Turbo Stream은 커스텀 HTML 요소를 통해 DOM을 동적으로 변경하는 강력한 기능을 제공합니다. 사용자가 폼을 제출하면 서버는 `<turbo-stream>` 태그를 포함한 응답을 보내고, Turbo는 이를 DOM에 추가하여 페이지를 업데이트합니다. 이 과정에서 Turbo가 폼 제출을 어떻게 감지하고 서버에 Turbo Stream 응답을 요청하는지, 그리고 서버로부터 받은 Turbo Stream 응답을 어떻게 처리하여 DOM을 변경하는지에 대한 근본적인 질문이 발생합니다. 본 글은 이러한 질문에 대한 답을 찾아 Turbo Stream의 내부 동작 원리를 심층적으로 탐구합니다.

Turbo의 폼 제출 처리 과정

Turbo는 documentsubmit 이벤트 리스너를 등록하여 폼 제출을 가로챕니다. 이후 브라우저의 기본 제출 동작을 preventDefault()로 막고, fetch API를 통해 서버로 데이터를 전송합니다. 이때 Accept 요청 헤더에 text/vnd.turbo-stream.html을 추가하여 서버에 Turbo Stream 응답을 요청합니다.

서버는 이 헤더를 인식하여 Content-Type: text/vnd.turbo-stream.html과 함께 Turbo Stream 요소로 응답할 수 있습니다. 만약 성공적인 제출 후 Turbo Stream 대신 일반 HTML 응답을 원한다면, 서버는 반드시 리다이렉션을 발행해야 합니다. 그렇지 않을 경우 Turbo는 오류를 발생시키며, 유효성 검사 오류와 같은 경우 일반 HTML을 직접 렌더링할 수 있습니다.

Turbo의 Turbo Stream 응답 처리 과정

Turbo는 turbo:before-fetch-response 이벤트에 리스너(`StreamObserver

inspectFetchResponse)를 연결합니다. fetch 요청 후 응답이 도착하면 이 이벤트가 디스패치되고, 리스너는 응답의 Content-Typetext/vnd.turbo-stream.html`인지 확인합니다.

Turbo Stream 응답으로 확인되면, 해당 내용을 DOM에 추가합니다. DOM에 <turbo-stream> 요소가 추가되는 순간, 각 요소에 정의된 action (예: append, prepend, remove)에 따라 커스텀 JavaScript 코드가 실행되어 실제 DOM 변경이 발생합니다. 서버는 단일 응답으로 여러 <turbo-stream> 요소를 보낼 수 있으며, 모든 액션은 순차적으로 처리됩니다.

일반 fetch 요청 시에도 Accept 헤더를 text/vnd.turbo-stream.html로 설정하여 Turbo Stream을 요청할 수 있으며, @rails/request.js 라이브러리의 responseKind: "turbo-stream" 옵션을 통해 편리하게 구현 가능합니다.

결론

Turbo Stream의 폼 제출 흐름은 개념적으로 간단합니다. Turbo는 폼 제출을 가로채 서버에 Turbo Stream 응답을 요청하는 특별한 헤더를 추가합니다. 서버로부터 성공적인 Turbo Stream 응답을 받으면, Turbo는 이를 DOM에 추가하고, 각 `<turbo-stream>` 요소에 정의된 커스텀 동작이 자동으로 실행되어 사용자에게 앱 업데이트를 즉시 시각적으로 제공합니다. 이처럼 Turbo의 내부 동작 원리를 이해하는 것은 문제 해결 능력을 향상시키고, 필요할 경우 Turbo의 기본 동작을 확장하는 데 자신감을 부여합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!