RTCPeerConnection
는 WebRTC API의 핵심 인터페이스입니다. 로컬 피어와 원격 피어 간의 연결을 나타내며 연결을 설정하는 데 필요한 모든 함수와 이벤트를 제공합니다.
피어 연결 설정
WebRTC 기능을 구현하는 애플리케이션은 일반적으로 RTCPeerConnection
인터페이스를 많이 사용합니다. 호출자 측 (즉, 연결을 시작하는 피어)에서 연결을 설정하는 프로세스는 일반적으로 다음과 같습니다.
- 적절한 ICE 구성으로 새
RTCPeerConnection
인스턴스를 만듭니다. RTCPeerConnection.createOffer()
를 사용하여 로컬 SDP 설명을 만듭니다.RTCPeerConnection.setLocalDescription()
를 사용하여 로컬 SDP 설명을 설정합니다.- 신호 전달 서비스를 사용하여 로컬 SDP 설명을 원격 피어로 전송합니다.
RTCPeerConnection
에icecandidate
이벤트 리스너를 등록합니다.- 각
icecandidate
이벤트를 신호 전달 서비스를 사용하여 원격 피어로 전송합니다. - 신호 전달 서비스에서 수신되는 원격 SDP 설명을 기다렸다가
RTCPeerConnection.setRemoteDescription()
를 사용하여 설정합니다. - 신호 전달 서비스에서 수신되는 원격 ICE 후보를 기다렸다가
RTCPeerConnection.addIceCandidate()
를 사용하여 추가합니다.
호출 대상 측에서는 프로세스가 약간 다릅니다.
- 적절한 ICE 구성으로 새
RTCPeerConnection
인스턴스를 만듭니다. - 신호 전달 서비스에서 수신되는 원격 SDP 설명을 기다렸다가
RTCPeerConnection.setRemoteDescription()
를 사용하여 설정합니다. RTCPeerConnection.createAnswer()
를 호출하여 원격 SDP 설명에 대한 응답을 만듭니다.- 신호 전달 서비스를 사용하여 원격 피어에 응답을 전송합니다.
RTCPeerConnection
에icecandidate
이벤트 리스너를 등록합니다.- 각
icecandidate
이벤트를 신호 전달 서비스를 사용하여 원격 피어로 전송합니다. - 신호 전달 서비스에서 수신되는 원격 ICE 후보를 기다렸다가
RTCPeerConnection.addIceCandidate()
를 사용하여 추가합니다.
이 API의 문제는 이러한 작업의 대부분이 비동기식이라는 점입니다. 이로 인해 WebRTC 애플리케이션의 실제 구현이 복잡해지는 경우가 많습니다.
대부분의 함수는 Promise
를 반환하며, 이 Promise
는 프로세스의 다음 단계를 계속하기 전에 해결해야 합니다.
이 API를 사용하여 애플리케이션을 구현할 때는 리스너를 등록하는 대신(Promise.then()
사용) async
및 await
를 사용하는 것이 좋습니다. 이렇게 하면 코드를 더 쉽게 따라갈 수 있습니다. 다음 예를 고려해 보세요.
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
async
및 await
를 사용하여 위의 코드를 작성하면 다음과 같이 표시됩니다.
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}