Turbo Stream Broadcast를 활용한 메시지 실시간 처리 구현

AI on Rails: Broadcasting messages live with Turbo Streams

작성자
Ruby AI News
발행일
2025년 12월 23일

핵심 요약

  • 1 Rails 애플리케이션에서 Turbo Stream Broadcast를 활용하여 메시지의 실시간 생성 및 업데이트 기능을 구현합니다.
  • 2 메시지 모델에 `after_create_commit` 및 `after_update_commit` 콜백을 정의하여 메시지 생성 시 `append`, 업데이트 시 `replace`를 자동으로 브로드캐스트합니다.
  • 3 컨트롤러에서 명시적인 메시지 렌더링 로직을 제거하고, 에이전트 모델의 콜백을 통해 메시지 중복 생성 없이 효율적인 실시간 업데이트를 달성합니다.

도입

본 문서는 Ruby on Rails 기반 애플리케이션에서 메시지 전송 시 발생하는 비동기적 표시 문제를 해결하고, 사용자 경험을 향상시키기 위해 Turbo Stream Broadcast를 활용하는 방법을 설명합니다. 기존 시스템에서는 사용자 메시지와 AI 비서 메시지가 동시에 표시되어 실시간 상호작용의 느낌을 주지 못했습니다. 이를 개선하여 사용자 메시지는 즉시 표시되고, AI 비서 메시지는 처리 완료 후 지연되어 표시되도록 하는 것이 목표입니다. 이 과정에서 모델, 뷰, 컨트롤러 전반에 걸친 코드 수정 및 최적화가 이루어집니다.

1. AI Agent Message 모델 설정

메시지 모델에 after_create_commitafter_update_commit 콜백을 추가하여 Turbo Stream 브로드캐스트를 활성화합니다.

  • 생성 시: broadcast_append_to를 사용하여 messages div에 새 메시지를 추가합니다. 이는 메시지 생성 시 즉각적인 UI 업데이트를 가능하게 합니다.

  • 업데이트 시: broadcast_replace_to를 사용하여 특정 메시지 컴포넌트를 교체합니다. 이는 스트리밍 메시지나 메시지 내용 변경 시 유용합니다. 이를 위해 메시지 컴포넌트에는 고유한 ID가 필요합니다.

2. 뷰 (Show 뷰 및 메시지 컴포넌트) 변경

실시간 업데이트를 수신하고 올바르게 렌더링하기 위해 뷰를 조정합니다.

  • Show: turbo_stream_from 헬퍼를 사용하여 특정 agent_task에 대한 Turbo Stream 채널을 구독합니다. 이로써 해당 task와 관련된 모든 Turbo Stream 브로드캐스트를 수신할 수 있게 됩니다.

  • Messages Div ID: 메시지를 담는 div 요소의 ID를 agent_task_ID_messages 형식으로 변경하여 여러 태스크가 동시에 열려 있어도 충돌 없이 작동하도록 합니다.

  • 메시지 컴포넌트 ID: 각 메시지 컴포넌트(_message.html.erb)에 agent_task_ID_message_ID 형식의 고유 ID를 부여합니다. 이는 broadcast_replace_to가 특정 메시지를 정확히 찾아 업데이트하는 데 필수적입니다.

3. 컨트롤러 (Create 액션) 최적화

메시지 생성 로직을 간소화하고 Turbo Stream의 이점을 극대화합니다.

  • 메시지 렌더링 제거: create 액션에서 메시지를 명시적으로 turbo_stream.append하는 로직을 제거합니다. 이제 메시지 모델의 after_create_commit 콜백이 이 역할을 대신하여 메시지 생성 시 자동으로 UI를 업데이트합니다.

  • 폼 초기화 유지: 메시지 입력 폼은 turbo_stream.replace를 통해 비어 있는 부분 뷰로 교체하여 계속해서 초기화됩니다.

4. 에이전트 모델 (Agent 모델) 콜백 추가

AI 에이전트의 메시지 처리 방식을 개선합니다.

  • add_message 콜백: LangChain assistantadd_message 콜백을 추가하여 AI 비서가 새 메시지를 생성할 때 이를 감지합니다. 이 콜백은 task.upsert_message를 호출하여 메시지를 데이터베이스에 저장합니다.

  • upsert_message 메서드: 이 메서드는 메시지 또는 도구 호출의 중복 생성을 방지합니다. 기존 메시지가 이미 존재하면 새로 생성하지 않고, 필요한 경우 업데이트합니다.

  • 메시지 기록 전달: 에이전트에게 과거 메시지 기록을 전달할 때, tool_callstool_call_id 정보도 함께 포함하도록 하여 향후 도구 호출 기능 구현에 대비합니다.

5. 컨트롤러 (Agent Tasks 컨트롤러) 메시지 중복 생성 제거

이전에는 task.agent.run 호출 후 컨트롤러에서 수동으로 메시지를 생성하는 부분이 있었습니다. 이제 에이전트 모델의 add_message 콜백이 메시지 생성을 처리하므로, 컨트롤러의 중복 생성 로직을 제거합니다. 또한, 메시지 렌더링에 더 이상 필요 없는 response 변수도 함께 제거하여 코드를 더욱 간결하게 만듭니다. 이로써 메시지가 두 번 생성되는 문제를 해결하고, Turbo Stream을 통한 단일하고 효율적인 메시지 흐름을 구축합니다.

결론

이러한 변경사항들을 통해 Ruby on Rails 애플리케이션은 Turbo Stream Broadcast를 활용하여 메시지 처리의 반응성과 효율성을 크게 향상시켰습니다. 모델 콜백을 통한 자동 브로드캐스트, 뷰의 동적 ID 설정, 그리고 컨트롤러의 간소화된 로직은 사용자에게 즉각적이고 부드러운 실시간 상호작용 경험을 제공합니다. 특히, 메시지 중복 생성을 방지하고 에이전트의 메시지 처리를 통합함으로써 코드의 유지보수성을 높이고 시스템의 안정성을 확보했습니다. 이 접근 방식은 실시간 기능이 필요한 다양한 웹 애플리케이션에 적용될 수 있는 강력한 패턴을 제시합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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