실시간으로 채팅 데이터를 업데이트하여 화면에 보여주기 위해 Apollo Client에서 제공하는 구독 기능을 사용해 보았습니다
subscribeToMore
에 2가지 옵션을 전달합니다.
useEffect(() => {
subscribeToMore({
document: MESSAGES_SUBCRIPTION,
updateQuery: (prev, { subscriptionData }) => {
console.log('test ======> ', { prev, subscriptionData });
},
});
}, []);
document
: 구독할 쿼리variables
: 구독을 실행할 때 포함할 변수updateQuery
: 쿼리의 현재 캐시 된 결과(prev)
를 GraphQL 서버
에서 푸시한 결과(subscriptionData)
와 결합하는 방법
을 알려주는 함수공식문서 설명처럼 prev
에는 getMessage
쿼리의 캐시된 값이 들어있고 subscriptionData
에는 새로 업데이트된 newMessage
가 들어가 있네요!
기존 getMessage 쿼리 데이터의 구조와 동일한 모양을 반환하여 캐시를 업데이트 해주었습니다
updateQuery: (prev, { subscriptionData }) => {
if (!subscriptionData.data) return prev;
const newMessageItem = subscriptionData.data.newMessage;
return {
getMessage: {
...prev.getMessage,
messages: [newMessageItem, ...prev.getMessage.messages],
// `[새로운 데이터, ...기존데이터]`
},
};
},
https://www.apollographql.com/docs/react/data/subscriptions/#subscribing-to-updates-for-a-query