LiveKit은 WebRTC 기반의 실시간 통신을 위한 오픈 소스 플랫폼입니다. livekit-client는 이 플랫폼에 접속하여 영상/음성 스트림을 송수신하는 클라이언트 라이브러리이며, React 개발을 더 쉽게 하기 위해 @livekit/react-components 같은 보조 라이브러리도 제공됩니다.
LiveKit 클라이언트를 이해하기 위해서는 다음의 주요 개념을 아는 것이 중요합니다.
Room 내에서 이루어집니다.Room에 접속한 각 사용자(클라이언트)를 의미합니다. 자신은 로컬 참가자(LocalParticipant)이고, 다른 사용자는 원격 참가자(RemoteParticipant)로 구분됩니다.Participant가 자신의 Track을 Room에 공유하는 행위를 의미합니다. 다른 Participant는 게시된 Track을 구독하여 볼 수 있습니다.livekit-client: LiveKit 서버와의 연결을 관리하는 핵심 라이브러리입니다.@livekit/react-components: LiveKit 기능을 React 컴포넌트와 훅(hook)으로 추상화하여 제공합니다. 이를 사용하면 복잡한 연결 및 상태 관리를 쉽게 처리할 수 있습니다.LiveKit React 컴포넌트 라이브러리를 사용하면 복잡한 WebRTC 로직 없이 다음과 같은 순서로 화상 통화 앱을 구성할 수 있습니다.
LiveKitRoom 컴포넌트 사용하기:@livekit/react-components는 LiveKitRoom이라는 상위 컴포넌트를 제공합니다. 이 컴포넌트는 연결 상태, 참가자 목록 등 Room의 모든 상태를 관리하며, 내부 컴포넌트에 상태를 전달합니다.
import { LiveKitRoom, VideoConference } from '@livekit/react-components';
import { useToken } from './hooks'; // 토큰을 가져오는 커스텀 훅
const MyVideoRoom = () => {
// 1. LiveKit 서버에 접속하기 위한 토큰을 가져옵니다.
const token = useToken(); // 이 토큰은 LiveKit 서버에서 발급받아야 합니다.
// 토큰이 없으면 연결할 수 없습니다.
if (!token) return <div>토큰을 불러오는 중...</div>;
return (
// 2. LiveKitRoom 컴포넌트로 전체 방을 감쌉니다.
<LiveKitRoom
token={token}
serverUrl="wss://<your-livekit-server-url>" // LiveKit 서버 URL
connect={true}
// 연결 성공 및 실패 시 동작을 정의할 수 있습니다.
onConnected={() => console.log('연결 성공!')}
onError={(error) => console.error('연결 실패:', error)}
>
{/* 3. 내부에 비디오 컴포넌트들을 추가합니다.
VideoConference는 참가자의 비디오를 보여주는 사전 제작된 컴포넌트입니다. */}
<VideoConference />
</LiveKitRoom>
);
};
@livekit/react-components의 훅을 사용하면 개별 컴포넌트에서 참가자의 상태를 쉽게 가져올 수 있습니다.
useParticipants(): 현재 Room에 있는 모든 참가자 목록을 가져옵니다.useTracks(): 특정 참가자의 트랙 목록을 가져옵니다.예시: 로컬 참가자의 비디오를 렌더링하는 컴포넌트
import { useLocalParticipant, useTracks } from '@livekit/react-components';
import { Track } from 'livekit-client';
const MyLocalVideo = () => {
// 로컬 참가자 객체를 가져옵니다.
const { localParticipant } = useLocalParticipant();
// 로컬 참가자의 비디오 트랙을 가져옵니다.
const videoTracks = useTracks([Track.Source.Camera]);
if (videoTracks.length === 0) {
return <div>카메라를 불러오는 중...</div>;
}
// 첫 번째 비디오 트랙을 사용하여 비디오 요소를 렌더링합니다.
const videoTrack = videoTracks[0];
return (
<div>
<h3>나 ({localParticipant.identity})</h3>
<video ref={(el) => videoTrack?.attach(el)} />
</div>
);
};
LiveKit 클라이언트를 React와 TypeScript로 구현할 때의 핵심은 다음과 같습니다.
livekit-client와 *@livekit/react-components를 함께 사용합니다.LiveKitRoom 컴포넌트로 전체 애플리케이션의 상태를 관리하고, 그 내부에 UI 컴포넌트들을 배치합니다.useLocalParticipant(), useParticipants(), useTracks() 등 라이브러리에서 제공하는 훅(hook)을 활용하여 비디오, 오디오 및 참가자 상태를 쉽게 제어합니다.