useSubscription을 활용한 실시간 구독
WebSocket 링크를 설정하고, useSubscription()을 사용해 구독 데이터를 반응형 상태에 병합합니다.
useSubscription을 활용한 실시간 구독은(는) CoddyKit의 무료 Vue Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Vue Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
구독으로 실시간 데이터 받기
GraphQL 구독은 지속적인 연결을 통해 서버에서 클라이언트로 데이터를 푸시합니다. 쿼리가 한 번 데이터를 가져오는 방식이라면 구독은 업데이트를 스트리밍하므로 채팅, 실시간 피드, 알림에 적합합니다.
WebSocket 전송
구독에는 오래 유지되는 연결이 필요하므로 HTTP 대신 WebSockets를 사용합니다. graphql-ws 라이브러리는 GraphQLWsLink를 통해 최신 프로토콜을 제공합니다.
npm install graphql-wsWebSocket 링크 만들기
wss:// 구독 엔드포인트를 가리키는 GraphQLWsLink로 graphql-ws 클라이언트를 감쌉니다.
import { GraphQLWsLink } from '@apollo/client/link/subscriptions'
import { createClient } from 'graphql-ws'
const wsLink = new GraphQLWsLink(createClient({
url: 'wss://api.example.com/graphql'
}))전송 방식의 문제
쿼리와 뮤테이션은 계속 HTTP를 통해 보내고 구독은 WebSocket을 통해 보내야 합니다. 하나의 링크를 모든 작업에 사용할 수는 없으므로 작업 유형에 따라 트래픽을 분할해야 합니다.
링크 분할
split 함수는 각 작업을 라우팅합니다. 구문 분석한 작업 정의를 기준으로 구독은 WebSocket 링크로, 나머지는 HTTP 링크로 보냅니다.
import { split, HttpLink } from '@apollo/client/core'
import { getMainDefinition } from '@apollo/client/utilities'
const httpLink = new HttpLink({ uri: '/graphql' })
const link = split(
({ query }) => {
const def = getMainDefinition(query)
return def.kind === 'OperationDefinition' && def.operation === 'subscription'
},
wsLink,
httpLink
)분할 링크를 클라이언트에 연결하기
일반적인 uri 대신 결합한 link를 Apollo 클라이언트에 전달합니다. 이제 클라이언트가 각 작업을 라우팅하는 방법을 알게 됩니다.
const apolloClient = new ApolloClient({
link,
cache: new InMemoryCache()
})useSubscription 기초
useSubscription 컴포저블은 스트림을 열고 반응형 상태를 반환합니다. useQuery와 마찬가지로 result, loading, error를 제공합니다.
import { useSubscription } from '@vue/apollo-composable'
import { gql } from '@apollo/client/core'
const { result } = useSubscription(gql(
'subscription { messageAdded { id text } }'
))각 푸시 처리하기
onResult 훅을 사용하면 이벤트가 도착할 때마다 반응할 수 있습니다. 스트리밍 데이터를 처리하기에 알맞은 위치입니다.
const { onResult } = useSubscription(MESSAGE_ADDED)
onResult((res) => {
console.log('New message', res.data.messageAdded)
})반응형 배열에 추가하기
일반적인 패턴은 로컬 반응형 배열을 유지하고 새 이벤트가 올 때마다 추가하는 것입니다. 그러면 템플릿이 계속 늘어나는 실시간 목록을 렌더링합니다.
const messages = ref([])
const { onResult } = useSubscription(MESSAGE_ADDED)
onResult((res) => {
messages.value.push(res.data.messageAdded)
})구독 변수
구독도 쿼리와 마찬가지로 변수를 받습니다. 예를 들어 하나의 채팅방에 대한 메시지를 구독할 수 있습니다.
useSubscription(
gql('subscription($room: ID!) { messageAdded(room: $room) { text } }'),
{ room: 'general' }
)구독과 폴링 비교
폴링은 일정한 시간 간격으로 쿼리를 다시 가져오지만, 구독은 무언가 변경될 때만 푸시합니다. 진정한 실시간 데이터에는 구독이 더 효율적이고, 거의 실시간이면 충분할 때는 폴링이 더 간단합니다.
빠른 확인
구독에 대한 지식을 확인해 보세요.
복습
실시간 구독에 대해 다음을 배웠습니다.
- 구독은 GraphQLWsLink (graphql-ws)를 통해 WebSockets로 데이터를 푸시합니다.
- split()을 사용해 구독은 WS로, 쿼리와 뮤테이션은 HTTP로 보냅니다.
- useSubscription은 각 푸시에 대응하는 onResult와 함께 반응형 result를 반환합니다.
- 실시간 목록을 만들려면 푸시된 이벤트를 반응형 배열에 추가합니다.
자주 묻는 질문
“useSubscription을 활용한 실시간 구독” 강의는 무료인가요?
네 — “useSubscription을 활용한 실시간 구독” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Vue Academy 강의 전체를 잠금 해제할 수 있습니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“useSubscription을 활용한 실시간 구독”에서 뭘 배우나요?
WebSocket 링크를 설정하고, useSubscription()을 사용해 구독 데이터를 반응형 상태에 병합합니다. 브라우저에서 직접 실행하는 실습 코드로 Vue Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Vue Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Vue Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“useSubscription을 활용한 실시간 구독” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Vue Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Vue Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Vue 3에서 Apollo Client 설정
- 데이터 가져오기를 위한 useQuery
- 데이터 변경을 위한 useMutation
- useSubscription을 활용한 실시간 구독