미들웨어

적용 대상: SDK v4

미들웨어는 간단하게 말해서 어댑터와 봇 논리 사이에 위치하는 클래스로, 초기화하는 동안 어댑터의 미들웨어 컬렉션에 추가됩니다. SDK를 사용하면 사용자 고유의 미들웨어를 작성하거나 다른 사람이 만든 미들웨어를 추가할 수 있습니다. 봇으로 들어오거나 봇에서 나가는 모든 작업은 미들웨어를 통과합니다.

어댑터는 봇 미들웨어 파이프라인을 통해 들어오는 작업을 처리하고 봇의 논리로 전달한 다음 다시 다시 내보낼 수 있습니다. 각 작업이 봇으로 들어가고 나올 때 미들웨어의 각 부분은 봇 논리가 실행되기 전과 후에 작업을 검사하거나 작업에 따라 작동합니다.

미들웨어로 전환하기 전에 일반적으로 봇과 봇이작업을 처리하는 방법을 이해하는 것이 중요합니다.

미들웨어 사용

"일반적인 봇 논리를 사용하는 대신 미들웨어로 작업을 구현해야 하는 경우"라는 질문이 자주 나옵니다. 미들웨어는 대화가 처리 될 때마다 사용자의 대화 흐름과 상호 작용할 수 있는 추가 기회를 제공합니다. 또한 미들웨어는 대화와 관련된 정보를 저장 및 검색하고 필요한 경우 추가 처리 논리를 호출할 수 있습니다. 아래는 미들웨어가 유용할 수 있는 일반적인 시나리오입니다.

모든 작업을 살펴보거나 모든 작업에 따라 작동

봇이 모든 작업 또는 특정 유형의 모든 작업에 대해 무언가를 해야 하는 여러 상황이 있습니다. 예를 들어 봇이 수신하는 모든 메시지 활동을 기록하거나 봇이 이 턴에 응답을 생성하지 않은 경우 대체 응답을 제공할 수 있습니다. 미들웨어는 나머지 봇 논리가 실행되기 전과 후에 작동하는 기능을 갖춘 이러한 프로세스에 적합한 장소입니다.

턴 컨텍스트 수정 또는 개선

작업에 제공되는 정보보다 더 많은 정보를 봇이 갖고 있으면 특정 대화가 훨씬 유익할 수 있습니다. 이 경우 미들웨어는 지금까지의 대화 상태 정보를 살펴보고, 외부 데이터 원본을 쿼리하고, 턴 컨텍스트 개체에 추가한 후 봇 논리에 대한 실행을 전달할 수 있습니다.

SDK는 들어오고 나가는 활동을 기록할 수 있는 로깅 미들웨어를 정의하지만, 사용자 고유의 미들웨어를 정의할 수도 있습니다.

봇 미들웨어 파이프라인

각 작업에 대해 어댑터는 미들웨어를 추가된 순서대로 호출합니다. 어댑터는 턴 및 다음 대리자에 대한 컨텍스트 개체를 전달하고, 미들웨어는 파이프라인의 다음 미들웨어에 컨트롤을 전달할 대리자를 호출합니다. 또한 미들웨어는 다음 대리자가 메서드를 반환한 후부터 완료하기 전까지 작업을 수행할 수 있는 기회가 있습니다. 각 미들웨어 개체에는 파이프라인에서 따르는 미들웨어 개체와 관련하여 작동할 수 있는 처음이자 마지막 기회가 있는 것으로 생각하셔도 좋습니다.

다음은 그 예입니다.

  • 첫 번째 미들웨어 개체의 순서 처리기는 다음을 호출하기 전에 코드를 실행합니다.
    • 두 번째 미들웨어 개체의 순서 처리기는 다음을 호출하기 전에 코드를 실행합니다.
      • 봇의 순서 처리기가 실행되고 반환됩니다.
    • 두 번째 미들웨어 개체의 순서 처리기는 반환하기 전에 나머지 코드를 실행합니다.
  • 첫 번째 미들웨어 개체의 순서 처리기는 반환하기 전에 나머지 코드를 실행합니다.

미들웨어가 다음 대리자를 호출하지 않는 경우 어댑터는 후속 미들웨어 또는 봇 턴 처리기 및 파이프라인 단락을 호출하지 않습니다.

봇 미들웨어 파이프라인이 완료되면 턴이 끝나고, 턴 컨텍스트가 범위를 벗어납니다.

미들웨어 또는 봇은 응답을 생성하고 응답 이벤트 처리기를 등록할 수 있지만, 응답이 별도의 프로세스에서 처리된다는 사실을 기억해야 합니다.

미들웨어 순서

미들웨어가 추가되는 순서에 따라 미들웨어가 작업을 처리하는 순서가 결정되므로 미들웨어 추가 순서를 결정하는 것이 중요합니다.

참고

이것은 대부분의 봇에서 작동하는 일반적인 패턴을 제공하기 위한 의도이지만, 미들웨어의 각 부분이 상황에 맞게 상호 작용하는 방식을 고려해야 합니다.

모든 봇에 먼저 미들웨어 파이프라인에 추가해야 하는 가장 낮은 수준의 작업을 처리합니다. 로깅, 예외 처리, 변역을 예로 들 수 있습니다. 들어오는 메시지를 먼저 번역할지, 메시지를 저장하기 전에 번역할지, 메시지 스토리지가 먼저 발생해야 하는지 등 필요에 따라 순서를 지정합니다. 이는 저장된 메시지가 번역되지 않음을 의미할 수 있습니다.

봇별 미들웨어는 마지막으로 미들웨어 파이프라인에 추가되어야 하며, 봇으로 전송된 모든 메시지에서 일부 처리를 수행하도록 구현하는 미들웨어입니다. 미들웨어가 상태 정보 또는 봇 컨텍스트에 설정된 기타 정보를 사용하는 경우 상태 또는 컨텍스트를 수정하는 미들웨어 뒤에 있는 미들웨어 파이프라인에 해당 미들웨어를 추가합니다.

단락

미들웨어 및 응답 처리기와 관련된 중요한 개념 중 하나는 단락 입니다. 이어지는 레이어를 통해 예외가 계속되는 경우 미들웨어(또는 응답 처리기)는 해당 다음 대리자를 호출하여 실행을 전달해야 합니다. 다음 대리자가 해당 미들웨어(또는 응답 처리기) 내에서 호출되지 않으면 연결된 파이프라인 단락 및 후속 계층이 실행되지 않습니다. 즉, 모든 봇 논리와 파이프라인에서 그 뒤에 있는 미들웨어를 건너뜁니다. 미들웨어와 응답 처리기가 턴을 단락하는 사이에는 미묘한 차이가 있습니다.

미들웨어가 턴을 단락하면 봇 턴 처리기가 호출되지 않지만 파이프라인에서 이 지점 이전에 실행된 모든 미들웨어 코드는 완료될 때 계속 실행됩니다.

이벤트 처리기의 경우 다음 을 호출하지 않는 것은 이벤트가 취소됨을 의미하며 이는 미들웨어 건너뛰기 논리와 매우 다릅니다. 어댑터는 이벤트의 나머지 부분을 처리하지 않음으로써 절대로 이벤트를 보내지 않습니다.

SendActivities처럼 응답 이벤트를 단락시키는 경우 본인이 의도한 동작이어야 합니다. 그렇지 않으면 버그를 수정하기가 어려울 수 있습니다.

응답 이벤트 처리기

애플리케이션 및 미들웨어 논리 외에도, 컨텍스트 개체에 응답 처리기(이벤트 처리기 또는 작업 이벤트 처리기라고도 함)를 추가할 수 있습니다. 이러한 처리기는 현재 컨텍스트 개체에서 관련 응답이 발생하면 실제 응답을 실행하기 전에 호출됩니다. 이러한 처리기는 실제 이벤트 전에 또는 후에 현재 응답의 나머지 부분에서 해당 형식의 모든 작업에 대해 무엇을 할 것인지 알고 있는 경우에 유용 합니다.

경고

각 응답 이벤트 처리기 내부에서 해당 작업 응답 메서드를 호출하지 않도록 주의해야 합니다. 예를 들어 on send activity 처리기 내에서 send activity 메서드를 호출하면 안 됩니다. 호출하면 무한 루프가 생성될 수 있습니다.

새 작업마다 실행할 새 스레드가 생깁니다. 작업을 처리하는 스레드가 생성되면 해당 작업에 대한 처리기 목록이 해당하는 새 스레드에 복사됩니다. 해당 시점 이후 추가된 처리기는 해당 활동 이벤트에 대해 실행되지 않습니다. 컨텍스트 개체에 등록된 처리기는 어댑터가 미들웨어 파이프라인을 관리하는 방법과 비슷하게 처리됩니다. 즉, 처리기는 추가된 순서대로 호출되며, 다음 대리자를 호출하면 등록된 그 다음 이벤트 처리기에 컨트롤이 전달됩니다. 처리기가 다음 대리자를 호출하지 않으면 후속 이벤트 처리기가 호출되지 않고 이벤트 단락이 발생하며 어댑터가 채널에 응답을 보내지 않습니다.

미들웨어의 상태 처리

상태를 저장하는 일반적인 방법은 턴 처리기의 끝에서 변경 내용 저장 메서드를 호출하는 것입니다. 다음은 통화에 초점을 맞춘 다이어그램입니다.

상태가 봇의 턴 처리기에서 저장된 봇 턴의 시퀀스 다이어그램입니다.

이 방법의 문제는 봇의 턴 처리기가 반환된 후에 발생하는 일부 사용자 지정 미들웨어에서 수행된 상태 업데이트가 지속형 스토리지에 저장되지 않는다는 것입니다. 해결 방법은 변경 내용 자동 저장 미들웨어의 인스턴스를 미들웨어 스택의 시작 부분에 추가하거나 적어도 상태를 업데이트할 수 있는 미들웨어 앞에 추가하여 사용자 지정 미들웨어가 완료된 후에 호출을 변경 내용 저장 메서드로 이동하는 것입니다. 실행은 아래와 같습니다.

미들웨어에서 상태를 저장한 봇 턴의 시퀀스 다이어그램.

업데이트해야 하는 상태 관리 개체를 봇 상태 세트 개체에 추가한 다음, 변경 내용 자동 저장 미들웨어를 만들 때 이 개체를 사용합니다.

추가 리소스

Bot Framework SDK [C# | JS]에 구현된 대본 로거 미들웨어를 살펴볼 수 있습니다.