피어 연결

RTCPeerConnection는 WebRTC API의 핵심 인터페이스입니다. 로컬 피어와 원격 피어 간의 연결을 나타내며 연결을 설정하는 데 필요한 모든 함수와 이벤트를 제공합니다.

피어 연결 설정

WebRTC 기능을 구현하는 애플리케이션은 일반적으로 RTCPeerConnection 인터페이스를 많이 사용합니다. 호출자 측 (즉, 연결을 시작하는 피어)에서 연결을 설정하는 프로세스는 일반적으로 다음과 같습니다.

  1. 적절한 ICE 구성으로 새 RTCPeerConnection 인스턴스를 만듭니다.
  2. RTCPeerConnection.createOffer()를 사용하여 로컬 SDP 설명을 만듭니다.
  3. RTCPeerConnection.setLocalDescription()를 사용하여 로컬 SDP 설명을 설정합니다.
  4. 신호 전달 서비스를 사용하여 로컬 SDP 설명을 원격 피어로 전송합니다.
  5. RTCPeerConnectionicecandidate 이벤트 리스너를 등록합니다.
  6. icecandidate 이벤트를 신호 전달 서비스를 사용하여 원격 피어로 전송합니다.
  7. 신호 전달 서비스에서 수신되는 원격 SDP 설명을 기다렸다가 RTCPeerConnection.setRemoteDescription()를 사용하여 설정합니다.
  8. 신호 전달 서비스에서 수신되는 원격 ICE 후보를 기다렸다가 RTCPeerConnection.addIceCandidate()를 사용하여 추가합니다.

호출 대상 측에서는 프로세스가 약간 다릅니다.

  1. 적절한 ICE 구성으로 새 RTCPeerConnection 인스턴스를 만듭니다.
  2. 신호 전달 서비스에서 수신되는 원격 SDP 설명을 기다렸다가 RTCPeerConnection.setRemoteDescription()를 사용하여 설정합니다.
  3. RTCPeerConnection.createAnswer()를 호출하여 원격 SDP 설명에 대한 응답을 만듭니다.
  4. 신호 전달 서비스를 사용하여 원격 피어에 응답을 전송합니다.
  5. RTCPeerConnectionicecandidate 이벤트 리스너를 등록합니다.
  6. icecandidate 이벤트를 신호 전달 서비스를 사용하여 원격 피어로 전송합니다.
  7. 신호 전달 서비스에서 수신되는 원격 ICE 후보를 기다렸다가 RTCPeerConnection.addIceCandidate()를 사용하여 추가합니다.

이 API의 문제는 이러한 작업의 대부분이 비동기식이라는 점입니다. 이로 인해 WebRTC 애플리케이션의 실제 구현이 복잡해지는 경우가 많습니다. 대부분의 함수는 Promise를 반환하며, 이 Promise는 프로세스의 다음 단계를 계속하기 전에 해결해야 합니다.

이 API를 사용하여 애플리케이션을 구현할 때는 리스너를 등록하는 대신(Promise.then() 사용) asyncawait를 사용하는 것이 좋습니다. 이렇게 하면 코드를 더 쉽게 따라갈 수 있습니다. 다음 예를 고려해 보세요.

function createAndSendOffer(peerConnection, signallingService) {
    peerConnection.createOffer()
                  .then(offer => {
                      signallingService.send({
                          type: 'offer',
                          data: offer
                      });
                  });
}

asyncawait를 사용하여 위의 코드를 작성하면 다음과 같이 표시됩니다.

async function createAndSendOffer(peerConnection, signallingService) {
    const offer = await peerConnection.createOffer();
    signallingService.send({
        type: 'offer',
        data: offer
    });
}