Turbo와 ActionCable을 통한 실시간 Rails 애플리케이션 구현의 내부 작동 방식

How does Turbo work with Action Cable?

작성자
Ruby Weekly
발행일
2025년 10월 17일

핵심 요약

  • 1 WebSocket은 양방향 통신 채널을 제공하여 서버가 클라이언트에게 비동기적으로 메시지를 보낼 수 있게 하며, 이는 실시간 기능의 핵심입니다.
  • 2 ActionCable은 WebSocket 연결을 관리하는 Rack 애플리케이션으로, `broadcast_*` 메서드를 통해 여러 프로세스에서 클라이언트로 메시지를 전송하기 위해 데이터베이스 또는 Redis와 같은 중간 매개체를 활용합니다.
  • 3 `turbo_stream_from` 헬퍼는 `Turbo::StreamsChannel`을 통해 WebSocket 연결을 설정하고, `signed-stream-name`을 사용하여 스트림 구독 요청의 유효성을 검증합니다.

도입

최신 Rails 애플리케이션은 `turbo-rails` 라이브러리를 활용하여 실시간 기능을 손쉽게 구현합니다. `turbo_stream_from` 및 `broadcast_*` 메서드는 서버가 클라이언트 요청 없이 `<turbo-stream>` 요소를 전송, DOM을 업데이트하여 실시간 사용자 경험을 제공합니다. 본 글은 WebSocket 연결의 원리, ActionCable의 역할, 그리고 다양한 프로세스에서 메시지가 브로드캐스트되는 메커니즘을 ActionCable의 단순화된 버전을 통해 탐구하여, 그 내부 동작에 대한 심층적인 이해를 돕고자 합니다.

WebSocket과 ActionCable의 기본

WebSocket은 HTTP와 달리 양방향 통신 채널을 제공하여 서버가 클라이언트 요청 없이 메시지를 전송할 수 있습니다. ActionCable은 Rails 앱 내 Rack 애플리케이션으로, websocket-driver-ruby 젬을 통해 WebSocket 연결을 관리하고, 열린 연결에 text() 메서드를 호출하여 클라이언트에 메시지를 보냅니다. 본문에서는 ToyCable이라는 단순화된 구현으로 이 과정을 보여줍니다.

다중 프로세스 메시지 브로드캐스트

ActionCable은 메인 Rails 프로세스에서 실행되므로, 비동기 작업 등 별도 프로세스에서 클라이언트에 메시지를 보내려면 중간 매개체가 필요합니다. ActionCable은 데이터베이스(Solid Cable), Redis, PostgreSQL의 pub/sub 등 다양한 어댑터를 활용합니다. 별도 프로세스가 중간 매개체에 메시지를 기록하면 ActionCable이 이를 수신하여 해당 클라이언트에 브로드캐스트합니다.

Turbo를 통한 실시간 스트림

turbo_stream_from 헬퍼는 뷰에 <turbo-cable-stream-source> HTML 요소를 렌더링하여 WebSocket 연결을 설정합니다. 이 요소의 signed-stream-name은 스트림 이름의 Base64 인코딩과 HMAC 서명으로 구성되어 구독 요청의 유효성을 검증하고 무단 변조를 방지합니다. Turbo::StreamsChannel은 이 서명 검증을 기반으로 작동하며, broadcast_to 메서드를 통해 특정 채널로 <turbo-stream> HTML을 전송하여 실시간 DOM 업데이트를 가능하게 합니다.

결론

ActionCable은 내부 구현의 복잡성을 추상화하여 개발자가 실시간 기능을 쉽게 사용할 수 있도록 합니다. 그러나 그 내부 작동 방식을 이해하는 것은 문제 해결 능력과 장기적인 역량 강화에 매우 중요합니다. 본 글에서 제시된 `ToyCable` 예시는 ActionCable의 핵심 메커니즘에 대한 기본적인 이해를 제공하며, 이는 추가적인 학습의 좋은 출발점이 될 수 있습니다. 이러한 지식은 Rails 애플리케이션에서 실시간 기능을 보다 효과적으로 설계하고 디버깅하는 데 기여할 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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