AI 스트리밍 응답과 로딩 상태를 화면 흐름으로 설계하는 법
“답변이 늦는 건 괜찮은데, 지금 요청이 들어간 건지 모르겠어요”
“글자가 나오기 시작한 뒤에는 전송 버튼을 다시 눌러도 되나요?”
“중간에 멈춘 답변과 오류가 난 답변을 화면에서 어떻게 구분해야 할까요?”
AI 기능의 로딩 상태는 하나의 isLoading으로 처리하기보다, 사용자가 무엇을 기다리고 다음에 무엇을 할 수 있는지에 따라 나눠야 합니다. 핵심은 네트워크의 내부 단계를 그대로 드러내는 일이 아니라, 화면에서 사용자가 판단할 수 있는 상태와 행동을 정의하는 일입니다.
알레오의 프론트엔드 개발자로서 웹 서비스의 화면 흐름을 설계할 때, 생성형 AI UI는 답변 텍스트를 받는 처리와 요청 경험을 분리해 보려 합니다. 스트리밍에서는 생성 중 상태가 길어질 수 있으므로 중단, 재시도, 추가 전송의 기준을 화면과 데이터 모델에 함께 남겨 두는 편이 낫습니다.
스트리밍 응답에서 무엇을 상태로 나눠야 할까요?

요청 전송, 첫 응답 대기, 텍스트 수신, 완료, 중단, 실패를 구분하는 것이 출발점입니다. 모든 단계를 별도 화면으로 만들기보다 사용자의 행동이 달라지는 경계에서 상태를 나누세요.
요청 버튼을 누른 직후부터 응답이 끝날 때까지 같은 스피너만 보여주면, 사용자는 요청이 접수됐는지, 답변이 생성되는지, 정상적으로 끝난 것인지 구분하기 어렵습니다. 전송 방식이 무엇이든 화면 상태는 사용자가 확인할 수 있는 변화와 후속 행동을 기준으로 설계하는 편이 좋습니다.
| 화면 상태 | 사용자가 알아야 할 사실 | 권장 UI 행동 |
|---|---|---|
| 입력 가능 | 아직 요청하지 않음 | 전송 버튼 활성화 |
| 요청 전송 중 | 요청을 제출했고 첫 응답을 기다림 | 중복 전송 정책과 취소 가능 여부 표시 |
| 스트리밍 중 | 답변이 추가되는 중 | 누적 텍스트와 중지 동작 제공 |
| 완료 | 이번 응답이 끝남 | 복사, 후속 질문, 재시도 제공 |
| 중단됨 | 사용자가 생성을 멈춤 | 중단 사실과 남은 텍스트의 상태 표시 |
| 실패 | 정상 완료 전에 요청이 끝남 | 가능한 다음 행동 안내 |
특히 완료되지 않은 assistant 메시지는 완료 메시지와 구분해 다루는 편이 좋습니다. 메시지 내용, 생성 상태, 요청 식별자, 오류 정보를 나누면 취소된 텍스트가 완료 답변처럼 보이는 문제를 줄이고 렌더링 조건도 분명해집니다.
첫 글자가 늦게 올 때 어떤 로딩 표시가 필요한가요?

첫 글자 전의 대기와 텍스트가 늘어나는 생성 중 표시는 다르게 보여주는 편이 좋습니다. 사용자가 기다리는 대상과 가능한 행동이 다르기 때문입니다.
요청 직후에는 입력 영역 가까이에서 요청 또는 답변 준비 상태를 짧게 알릴 수 있습니다. 첫 글자가 도착한 뒤에는 답변 말풍선이 진행 중이라는 점을 보여주는 방식이 자연스럽습니다. 반대로 빈 말풍선과 점 애니메이션만 길게 유지하면, 생성이 계속되는지 멈췄는지 판단하기 어려울 수 있습니다.
텍스트가 계속 늘어난다면 그것 자체가 진행 신호가 될 수 있습니다. 따라서 시각 효과를 늘리기보다 생성 중 새 질문을 막을지, 새 요청이 이전 요청을 중단할지, 대기열에 넣을지를 먼저 제품 정책으로 정하는 편이 중요합니다.
다음 항목은 구현 전에 팀이 합의할 수 있는 기준입니다.
- 입력 정책을 정합니다. 생성 중 입력은 허용하되 전송만 막을지, 새 전송이 이전 생성을 중단할지 정합니다.
- 중단 결과를 정합니다. 중단 시 누적 텍스트를 보존할지 삭제할지 정하고, 화면 문구와 데이터 상태를 맞춥니다.
- 재시도 범위를 정합니다. 같은 사용자 입력 전체를 다시 보낼지, 실패한 메시지만 다시 생성할지 구분합니다.
- 스크롤 정책을 정합니다. 사용자가 최신 답변을 읽을 때만 자동 스크롤하고, 이전 대화를 읽는 중이라면 강제로 이동시키지 않습니다.
짧은 검색 보조 기능과 긴 문서 생성 기능은 사용자가 기다리는 시간과 수정 방식이 다릅니다. 다른 화면을 그대로 복제하기보다, 생성 중에도 사용자가 해야 하는 행동부터 목록으로 적어 보는 편이 안전합니다.
중단과 오류는 왜 별도 상태여야 하나요?

사용자 중단은 의도한 종료이고 오류는 복구 여부를 판단해야 하는 종료입니다. 두 상태를 같은 실패 화면으로 합치면 사용자가 결과와 다음 행동을 오해할 수 있습니다.
중단 뒤 일부 텍스트가 남아 있다면, 그 텍스트는 완성 답변이 아니라 사용자가 멈춘 생성 결과입니다. 화면에 이를 표시하지 않으면 모델이 답변을 마친 것으로 보일 수 있습니다. 반면 오류가 발생한 경우에는 다시 시도할 수 있는지, 입력을 유지할지, 다른 안내가 필요한지를 판단할 수 있어야 합니다.
구현에서는 취소 동작이 발생했을 때 읽기 작업과 화면 상태가 함께 종료되도록 설계해야 합니다. 종료 뒤 도착한 조각이 이미 끝난 메시지에 추가되지 않게 하려면, 현재 요청인지 확인하는 식별자나 상태 전이 규칙을 둘 수 있습니다.
오류 문구에는 내부 예외를 그대로 노출하기보다 사용자가 할 수 있는 행동을 남기는 편이 좋습니다. 재시도가 가능한 경우에는 재시도 경로를 제공하고, 권한이나 사용 한도처럼 재시도만으로 해결되지 않을 수 있는 경우에는 그에 맞는 안내를 준비합니다. 서버의 안전한 오류 분류와 UI 문구를 연결하면 원인을 과도하게 단정하지 않을 수 있습니다.
상태는 컴포넌트와 데이터 중 어디에 두어야 할까요?
입력창의 열림 여부처럼 지역적인 UI 상태는 컴포넌트 가까이에 두고, 대화 메시지와 요청 생명주기처럼 여러 영역이 참조하는 정보는 명시적인 상태 모델로 관리하는 편이 좋습니다.
스트리밍 텍스트를 상태에 반영할 때는 메시지 하나의 변경이 대화 전체의 불필요한 갱신으로 번지지 않는지 점검할 필요가 있습니다. 반대로 갱신을 지나치게 늦추면 스트리밍으로 전달하려는 진행감을 잃을 수 있습니다. 메시지 단위의 업데이트 범위, 렌더링 빈도, 스크롤 동작은 실제 화면에서 함께 확인하며 조정하세요.
상태의 소유자와 수명을 정하는 관점은 알레오 공식 웹사이트에서 소개하는 웹 서비스 운영 흐름을 검토할 때도 적용할 수 있습니다. 특정 라이브러리를 먼저 고르기보다 어떤 상태가 어디에서 끝나고 복원돼야 하는지부터 정하는 방식입니다.
상태 모델은 적어도 다음 질문에 답해야 합니다.
- 지금 표시한 텍스트는 확정된 메시지인가, 생성 중인 임시 메시지인가?
- 현재 요청을 중지할 수 있는가?
- 같은 입력을 다시 보내도 되는가?
- 화면을 닫았다 돌아왔을 때 어떤 상태를 복원할 것인가?
- 오류 뒤에 사용자의 입력과 이전 답변을 유지할 것인가?
이 질문의 답을 타입과 화면 정책에 함께 남기면 버튼 비활성화나 빈 상태 처리가 개별 컴포넌트의 임시 조건문으로 흩어지는 일을 줄일 수 있습니다.
접근성과 테스트는 어떤 흐름으로 점검해야 하나요?
스트리밍으로 자주 바뀌는 내용과 사용자가 즉시 판단해야 하는 완료, 오류, 전송 불가 상태는 구분해 점검해야 합니다. 테스트는 시간 지연 자체보다 상태 전이와 중단 뒤의 화면을 우선 확인하세요.
동적으로 바뀌는 텍스트를 보조기술에 어떻게 알릴지는 사용하는 컴포넌트와 화면 맥락에 따라 검토할 항목입니다. 생성 완료, 오류, 전송 불가처럼 사용자의 판단이 필요한 변화가 전달되는지 확인하고, 실제 키보드와 사용하는 보조기술 환경에서 화면 흐름을 점검하는 것이 좋습니다.
실제 모델 응답을 기다리지 않아도 스트림 조각을 통제하는 모의 응답으로 다음 전이를 확인할 수 있습니다.
- 전송 뒤 첫 조각 전까지 대기 표시가 나타나는지
- 조각이 도착하면 진행 중 메시지에 누적되는지
- 중단 뒤 추가 조각이 화면에 반영되지 않는지
- 오류 뒤 재시도와 입력 보존이 의도대로 동작하는지
- 완료 뒤 버튼과 포커스가 정상 상태로 돌아오는지
결론
AI 스트리밍 UI의 기준은 답변이 빨리 보이는지보다 사용자가 대기, 생성, 중단, 실패를 구별하고 다음 행동을 선택할 수 있는지에 있습니다.
먼저 상태 이름과 각 상태에서 가능한 행동을 표로 합의하세요. 그다음 전송 방식, 상태 관리 도구, 애니메이션을 선택하면 구현 선택의 이유가 분명해집니다. 생성 중 메시지와 완료된 메시지를 데이터에서 구분하고, 취소와 오류를 별도의 종료 경로로 다루는 것이 출발점입니다.
자주 묻는 질문
스트리밍을 쓰지 않으면 AI 기능의 사용자 경험이 나쁜가요?
아닙니다. 짧은 응답이 일정하게 돌아오고 사용자가 중간 결과를 볼 필요가 없다면 일반 응답도 적절할 수 있습니다. 다만 응답 시간이 길거나 결과가 길다면 대기 상태와 다음 행동을 설명하는 설계가 더 중요해집니다.
생성 중에 전송 버튼을 비활성화해야 하나요?
반드시 비활성화할 필요는 없습니다. 중복 요청을 막아야 한다면 비활성화할 수 있지만, 여러 요청을 다룬다면 대기열이나 이전 요청 중단 같은 정책을 함께 정해야 합니다.
중단된 답변을 화면에 남겨도 되나요?
남길 수 있지만 완료된 답변처럼 보이지 않게 해야 합니다. 사용자가 중지한 결과라는 상태와 후속 행동을 함께 제공하세요.
스트리밍 조각마다 상태를 업데이트해도 되나요?
가능하지만 화면 갱신 범위와 스크롤 동작을 점검해야 합니다. 답변 길이, 조각 빈도, 대화 목록 구조에 맞춰 업데이트 방식을 조정하세요.
제 도움이 필요하시다면
알레오의 프론트엔드 개발 관점에서 AI 기능 화면의 요청 흐름, 메시지 상태 모델, 오류와 중단 화면을 함께 점검할 수 있습니다. 기존 서비스에 생성형 AI를 연결하면서 전송 버튼의 정책, 스트리밍 메시지의 데이터 구조, 접근성 테스트 범위를 정하지 못한 팀에 적합합니다.
AI 검색 진단, 콘텐츠 발행, 기술 SEO 설정을 연결하는 서비스 흐름은 알레오 공식 웹사이트에서 확인할 수 있습니다. 구체적인 화면과 API 조건이 있다면 관리형 연락 수단을 통해 현재 구현 단계와 고민을 알려 주세요.




