연습 - 출력 바인딩을 사용하여 데이터 작성

완료됨

이전 연습에서는 Azure Cosmos DB 데이터베이스에서 책갈피를 조회하는 시나리오를 구현했습니다. 책갈피 컬렉션에서 데이터를 읽도록 입력 바인딩을 구성했습니다. 그러나 더 많은 것을 수행할 수 있습니다. 이제 쓰기를 포함하도록 시나리오를 확장해 보겠습니다. 다음 순서도를 사용하는 것이 좋습니다.

Decision flow diagram illustrating the process of adding a bookmark in Azure Cosmos DB back-end and returning a response.

이 시나리오에서는 컬렉션에 책갈피를 추가해 달라는 요청을 받습니다. 요청은 책갈피 URL과 함께 원하는 키 또는 ID를 전달합니다. 순서도에서 볼 수 있듯이 키가 백 엔드에 이미 존재하는 경우 오류로 응답합니다.

전달된 키를 찾을 수 없으면 데이터베이스에 새 책갈피를 추가합니다. 여기서 중지할 수 있지만 조금 더 수행해 보겠습니다.

순서도에서 또 다른 단계가 눈에 띄나요? 지금까지 처리 측면에서 받는 데이터를 별로 다루지 않았습니다. 받는 데이터를 데이터베이스로 이동합니다. 그러나 실제 솔루션에서는 특정 방식으로 데이터를 처리할 수도 있습니다. 동일한 함수에서 모든 처리를 수행할 수 있지만 이 연습에서는 추가 처리를 다른 구성 요소나 비즈니스 논리에 오프로드하는 패턴을 보여 줍니다.

책갈피 시나리오에서 작업 오프로딩의 좋은 예는 무엇일까요? 그렇다면, 새 책갈피를 QR 코드 생성 서비스로 보내면 어떨까요? 결과적으로 해당 서비스에서 URL에 대한 QR 코드를 생성하고 이미지를 Blob Storage에 저장하며 QR 이미지의 주소를 책갈피 컬렉션의 항목에 추가합니다. QR 이미지를 생성하기 위해 서비스를 호출하는 데는 시간이 많이 걸립니다. 따라서 결과를 기다리지 않고 작업을 함수에 넘겨 이 작업을 비동기적으로 완료하도록 합니다.

Azure Functions에서 다양한 통합 원본에 대한 입력 바인딩을 지원하는 것처럼, 데이터 원본에 데이터를 쉽게 쓸 수 있게 만들어주는 출력 바인딩에 대한 템플릿 집합도 있습니다. 출력 바인딩은 function.json 파일에도 구성됩니다. 이 연습에서 볼 수 있듯이 여러 데이터 원본 및 서비스와 작동하도록 함수를 구성할 수 있습니다.

Important

이 연습은 샌드박스 리소스와 이전 단원에서 만든 리소스를 기반으로 합니다. 특히 Azure Cosmos DB 데이터베이스, 책갈피 및 입력 바인딩을 기반으로 합니다. 이전 단원에서 연습을 완료하지 않은 경우에는 이 연습을 완료할 수 없습니다.

HTTP 트리거 함수 만들기

  1. Azure Portal에서 HttpTrigger2 함수 페이지의 맨 위에 있는 이동 경로에서 함수 앱의 이름을 선택하여 이전에 만든 함수 앱으로 이동합니다.

  2. 개요 페이지의 함수 탭에 사용자가 만든 HTTP 트리거 함수가 있어야 합니다.

  3. 함수 탭에서 만들기를 선택합니다. 함수 만들기 창이 나타납니다.

  4. 템플릿 선택 섹션에서 HTTP 트리거를 선택한 다음 만들기를 선택합니다. HttpTrigger3 함수의 개요 창이 나타납니다.

Azure Cosmos DB 입력 바인딩 추가

다른 Azure Cosmos DB 입력 바인딩을 추가해 보겠습니다.

  1. HttpTrigger3 함수 메뉴에서 통합을 선택합니다. 통합 창이 나타납니다.

  2. 입력 상자에서 입력 추가를 선택합니다. 입력 만들기 창이 나타납니다.

  3. 바인딩 형식 드롭다운 목록에서 Azure Cosmos DB를 선택합니다.

  4. Cosmos DB 계정 연결 설정은 이전 연습에서 만든 연결로 미리 채워져 있어야 합니다.

    연결 목록이 표시되지 않으면 다음 단계에 따라 새 연결을 만듭니다.

    1. Azure Cosmos DB 세부 정보 섹션의 Cosmos DB 계정 연결 설정에서 새로 만들기 링크를 선택합니다.

    2. 새 Cosmos DB 계정 연결 대화 상자가 나타나면 확인을 선택하여 연결을 만듭니다. 새 Cosmos DB 계정 연결이 생성됩니다.

  5. 이 창에서 다른 설정에 대해 다음 값을 입력합니다. 언제든지 설정의 용도를 자세히 알아보려면 오른쪽에 있는 정보 아이콘을 선택합니다.

    설정 설명
    문서 매개 변수 이름 bookmark 코드에서 이 바인딩을 식별하기 위해 사용하는 이름입니다.
    데이터베이스 이름 func-io-learn-db 작업할 데이터베이스입니다. 이 값은 이 단원의 앞부분에서 설정한 데이터베이스 이름입니다.
    컬렉션 이름 Bookmarks 데이터를 읽는 컬렉션의 이름입니다. 이 설정은 이 단원의 앞부분에서 정의했습니다.
    문서 ID {id} {id}를 추가하여 올바른 바인딩 식을 사용하고 쿼리 문자열에 전달된 매개 변수를 허용합니다.
    파티션 키 {id} 또한 {id}를 추가하여 올바른 바인딩 식을 사용하고 쿼리 문자열에 전달된 매개 변수를 허용합니다.
    SQL 쿼리(선택 사항) 비워 둠 ID를 기준으로 한 번에 하나의 항목만 검색하고 있습니다. 따라서 이 인스턴스에서 SQL 쿼리를 사용하는 것보다 문서 설정을 통해 필터링하는 게 낫습니다. 한 항목(SELECT * from b where b.ID = /id)을 반환하는 SQL 쿼리를 만들 수 있습니다. 이 쿼리는 실제로 항목을 반환하지만 항목 컬렉션 안에서 반환합니다. 코드가 불필요하게 컬렉션을 조작해야 합니다. 여러 문서를 가져오려면 SQL 쿼리 방법을 사용합니다.

    이전 연습에서 만든 입력 바인딩과 마찬가지로 특정 ID를 사용하여 책갈피를 조회하려고 하기 때문에 함수가 쿼리 문자열에서 받은 문서 ID를 바인딩 식이라고 하는 바인딩에 연결합니다. 함수 트리거는 쿼리 문자열을 사용하여 조회할 ID를 지정하는 HTTP 요청입니다. 바인딩은 0(찾을 수 없음) 또는 1(찾음) 문서를 반환합니다.

  6. 확인을 선택하여 입력 바인딩 구성을 저장합니다.

이제 Azure Cosmos DB 입력 바인딩이 생성되었습니다. 컬렉션에 새 항목을 쓸 수 있도록 출력 바인딩을 추가해 보겠습니다.

Azure Cosmos DB 출력 바인딩 추가

  1. HttpTrigger3통합 창에서, 출력 상자에서 출력 추가를 선택합니다. 출력 만들기 창이 나타납니다.

  2. 바인딩 형식의 드롭다운 목록에서 Azure Cosmos DB를 선택합니다.

  3. Cosmos DB 계정 연결 설정은 이전에 만든 연결로 미리 채워져 있어야 합니다. 그렇지 않은 경우 드롭다운 목록을 확장하고 HttpTrigger3 입력 바인딩에 대해 정의한 연결을 선택합니다.

  4. 출력 바인딩의 나머지 설정에 대해 다음 값을 입력합니다.

    설정 설명
    문서 매개 변수 이름 newbookmark 코드에서 이 바인딩을 식별하기 위해 사용하는 이름입니다. 이 매개 변수는 새로운 책갈피 항목을 작성하는 데 사용됩니다.
    데이터베이스 이름 func-io-learn-db 작업할 데이터베이스입니다. 이 값은 이 단원의 앞부분에서 설정한 데이터베이스 이름입니다.
    컬렉션 이름 Bookmarks 데이터를 읽는 컬렉션의 이름입니다. 이 값은 이 단원의 앞부분에서 정의한 컨테이너 이름입니다.
    파티션 키 /id 앞에서 책갈피 Azure Cosmos DB 컨테이너를 만들 때 정의한 파티션 키를 추가합니다. 여기에 입력된 키(입력 바인딩 구성 <key>에 지정됨)는 컨테이너에 있는 것과 일치해야 합니다.
  5. 확인을 선택하여 이 출력 바인딩 구성을 저장합니다.

이제 컬렉션을 읽어 들이고 데이터를 쓸 바인딩이 생겼습니다.

Azure Queue Storage 출력 바인딩 추가

Azure Queue 스토리지는 전 세계 어디서나 액세스할 수 있는 메시지를 저장하는 서비스입니다. 단일 메시지의 크기는 최대 64KB까지 가능하며, 큐에는 정의된 스토리지 계정의 총 용량 한도까지 수백만 개의 메시지가 포함될 수 있습니다. 다음 다이어그램에서는 이 시나리오에서 큐를 사용하는 방법을 개략적으로 보여 줍니다.

Illustration showing a storage queue with a function pushing and another function popping messages.

이 예에서는 add-bookmark라는 함수가 큐에 메시지를 추가하고 gen-qr-code라는 또 다른 함수가 동일한 큐에서 메시지를 표시하고 요청을 처리합니다. add-bookmark에서 큐에 메시지를 쓰거나 푸시하기 때문에 솔루션에 새 출력 바인딩을 추가합니다.

포털을 통해 바인딩을 만들어 보겠습니다.

  1. 함수의 통합 창으로 이동하여 출력 상자에서 출력 추가를 선택합니다. 출력 만들기 창이 나타납니다.

  2. 바인딩 형식 드롭다운 목록에서 Azure Queue Storage를 선택합니다.

    Microsoft.Azure.WebJobs.Extensions.Storage 확장을 설치하라는 메시지가 나타나면 설치를 선택하고 완료될 때까지 기다립니다.

다음으로 큐가 호스트되는 스토리지 계정 연결을 설정합니다.

  1. 스토리지 계정 연결 필드에서 새로 만들기를 선택합니다. 새 스토리지 계정 연결 대화 상자가 나타납니다.

  2. 이 모듈의 시작 부분에서 함수 앱을 만들 때 스토리지 계정도 생성되었습니다. 드롭다운 목록에서 해당 계정을 선택한 후 확인을 선택합니다.

    스토리지 계정 연결 설정이 연결 이름으로 채워집니다.

기본값을 유지할 수 있지만, 나머지 속성에 더 많은 의미를 부여하기 위해 일부 설정을 변경해 보겠습니다.

  1. 다음 이전 값을 새 값으로 바꿔서 출력 만들기 창에서 설정을 완료합니다.

    설정 이전 값 새 값 설명
    메시지 매개 변수 이름 outputQueueItem newmessage 코드에서 사용하는 바인딩 속성입니다.
    큐 이름 outqueue bookmarks-post-process 다른 함수가 추가로 처리할 수 있도록 책갈피를 배치하는 큐의 이름입니다.
  2. 확인을 선택하여 Azure Queue Storage의 출력 구성을 저장합니다.

업데이트 함수 구현

이제 모든 바인딩이 설정되었습니다. 함수에서 이러한 바인딩을 사용할 차례입니다.

  1. 코드 편집기에서 index.js 파일을 열려면 HttpTrigger3 함수를 선택합니다.

  2. 메뉴의 개발자에서 코드 + 테스트를 선택합니다. 함수의 코드+ 테스트 창이 나타납니다.

  3. index.js 파일의 모든 코드를 다음 코드 조각의 코드로 바꾸고 명령 모음에서 저장을 선택합니다.

    module.exports = function (context, req) {
    
        var bookmark = context.bindings.bookmark;
        if(bookmark){
                context.res = {
                status: 422,
                body : "Bookmark already exists.",
                headers: {
                'Content-Type': 'application/json'
                }
            };
        }
        else {
            
            // Create a JSON string of our bookmark.
            var bookmarkString = JSON.stringify({ 
                id: req.body.id,
                url: req.body.url
            });
    
            // Write this bookmark to our database.
            context.bindings.newbookmark = bookmarkString;
    
            // Push this bookmark onto our queue for further processing.
            context.bindings.newmessage = bookmarkString;
    
            // Tell the user all is well.
            context.res = {
                status: 200,
                body : "bookmark added!",
                headers: {
                'Content-Type': 'application/json'
                }
            };
        }
        context.done();
    };
    

이 코드의 기능을 분석해 보겠습니다.

  • 이 함수는 데이터를 변경하므로 HTTP 요청이 POST이고 책갈피 데이터가 요청 본문에 포함될 것으로 예상합니다.
  • Azure Cosmos DB 입력 바인딩은 수신한 id를 사용하여 문서 또는 책갈피를 검색하려고 시도합니다. 항목을 찾으면 bookmark 개체가 설정됩니다. if(bookmark) 조건은 항목이 있는지 여부를 확인합니다.
  • 데이터베이스에 추가하는 것은 context.bindings.newbookmark 바인딩 매개 변수를 JSON 문자열로 만든 새 책갈피 항목으로 설정하는 것만큼 간단합니다.
  • 메시지를 큐에 게시하는 것은 context.bindings.newmessage 매개 변수를 설정하는 것만큼 간단합니다.

참고

수행한 유일한 작업은 큐 바인딩을 만드는 것이었습니다. 큐는 명시적으로 만들지 않았습니다. 지금 바인딩의 능력을 목격하고 있습니다. 다음 알림에서 알 수 있듯이, 큐가 없으면 자동으로 만들어집니다.

Screenshot showing message that the queue will be auto-created. .

이것으로 끝입니다. 다음 섹션에서 진행 중인 작업을 살펴보겠습니다.

  1. 코드 편집기에서 run.ps1 파일을 열려면 창 맨 위에 있는 이동 경로에서 HttpTrigger3 함수를 선택합니다.

  2. 함수 메뉴의 개발자에서 코드 + 테스트를 선택합니다. HttpTrigger3 함수에 대한 코드 + 테스트 창이 나타나고 run.ps1의 기본 콘텐츠가 표시됩니다.

  3. 파일의 콘텐츠를 다음 코드로 바꿉니다.

    using namespace System.Net
    
    param($Request, $bookmark, $TriggerMetadata)
    
    if ($bookmark) {
        $status = 422
        $body = "Bookmark already exists."
    }
    else {
        $newBookmark = @{ id = $Request.Body.id; url = $Request.Body.url }
    
        Push-OutputBinding -Name newbookmark -Value $newBookmark
    
        Push-OutputBinding -Name newmessage -Value $newBookmark
    
        $status = [HttpStatusCode]::OK
        $body = "bookmark added!"
    }
    
    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
        StatusCode = $status
        Body = $body
        ContentType = "application/json"
    })
    
  4. 명령 모음에서 저장을 선택합니다. 연결이 만들어지고 로그 파일 세션이 열립니다.

이 코드의 기능을 분석해 보겠습니다.

  • 이 함수는 데이터를 변경하므로 HTTP 요청이 POST이고 책갈피 데이터가 요청 본문에 포함될 것으로 예상합니다.
  • Azure Cosmos DB 입력 바인딩은 요청의 id를 사용하여 문서 또는 책갈피를 검색하려고 시도합니다. 항목을 찾으면 bookmark 개체가 설정됩니다. if ($bookmark) 조건은 항목이 있는지 여부를 확인합니다.
  • 데이터베이스에 추가하는 것은 Cosmos DB 출력 바인딩(newbookmark)의 이름과 $newBookmark 개체의 값을 사용하여 Push-OutputBinding을 호출하는 것 만큼 간단합니다.
  • 큐에 메시지를 게시하는 것은 큐 출력 바인딩(newmessage)의 이름과 $newBookmark 개체의 값을 사용하여 Push-OutputBinding을 호출하는 것 만큼 간단합니다.

참고

수행한 유일한 작업은 큐 바인딩을 만드는 것이었습니다. 큐는 명시적으로 만들지 않았습니다. 지금 바인딩의 능력을 목격하고 있습니다. 다음 알림에서 알 수 있듯이, 큐가 없으면 자동으로 만들어집니다.

Screenshot showing UI tool tip that the queue will be auto-created.

이것으로 끝입니다. 다음 섹션에서 진행 중인 작업을 살펴보겠습니다.

사용해 보기

이제 여러 개의 출력 바인딩이 있으므로 테스트가 좀 더 까다로워졌습니다. 이전 단원에서는 쿼리 문자열과 함께 HTTP 요청을 전송하여 테스트하는 것으로 만족했지만 이번에는 HTTP 게시를 수행하려고 합니다. 또한 메시지에서 이 게시를 큐에 넣는지 확인해야 합니다.

  1. HttpTrigger3 함수에 대한 코드 + 테스트 창의 명령 모음에서 테스트/실행을 선택합니다. 다음 이미지와 같이 입력 탭이 열려 있는 새 창이 나타납니다.

    Screenshot showing the test/run pane.

  2. HTTP 메서드 드롭다운 목록에서 POST가 선택되어 있는지 확인합니다.

  3. 요청 본문의 내용을 다음 JSON 개체로 바꿉니다.

    {
        "id": "docs",
        "url": "https://learn.microsoft.com/azure"
    }
    
  4. 실행을 선택합니다.

  5. 프로그래매틱 진행 상황이 로그 창에 표시됩니다. 완료되면 HTTP 응답 콘텐츠 설정에서 출력 탭에 “책갈피가 이미 있습니다.”가 표시되는지 확인합니다.

    Screenshot of output tab showing bookmark already exists response.

    연습 - 입력 바인딩을 사용하여 데이터 읽기에서 책갈피 항목을 추가했습니다. 응답은 var bookmark = context.bindings.bookmark JavaScript가 올바르게 작동하고 PowerShell 코드가 동일한 연결을 만드는지 확인합니다.

  6. 데이터베이스에 두 번째 책갈피를 게시해 보겠습니다. 입력 탭을 선택합니다.

  7. 요청 본문의 내용을 다음 JSON 개체로 바꿉니다.

    {
        "id": "github",
        "url": "https://www.github.com"
    }
    
  8. 실행을 선택합니다.

  9. 다음 스크린샷과 같이 출력 탭의 HTTP 응답 콘텐츠에 “책갈피가 추가됨!”이 표시되는지 확인합니다.

    Screenshot of output tab showing bookmark added response.

축하합니다! 함수가 설계한 대로 작동합니다! 그러나 코드에 추가한 큐 작업은 어떻습니까? 그럼, 큐에 어떤 것이 쓰여 있는지 살펴보겠습니다.

메시지가 큐에 쓰여 있는지 확인합니다.

Azure Queue Storage 큐는 스토리지 계정에서 호스팅됩니다. 출력 바인딩을 만들 때 스토리지 계정을 구성했습니다.

  1. Azure Portal 전역 검색 창에 스토리지 계정을 입력한 후 결과 목록에서 스토리지 계정을 선택합니다. 스토리지 계정 창이 나타납니다.

    Screenshot showing search results for Storage Account search.

  2. newmessage 출력 바인딩을 구성하는 데 사용한 스토리지 계정을 선택합니다.

  3. 스토리지 계정 메뉴의 데이터 스토리지 아래에서 를 선택하여 이 스토리지 계정이 호스트하는 큐를 나열합니다. 다음 스크린샷과 같이 bookmarks-post-process 큐가 나열되는지 확인합니다.

    Screenshot showing queues hosted by this storage account.

  4. bookmarks-post-process를 선택하여 큐에 있는 메시지를 나열합니다. 모두 계획에 따라 진행된 경우, 데이터베이스에 책갈피를 추가할 때 게시한 메시지가 큐에 포함됩니다. 다음과 같이 표시됩니다.

    Screenshot of message queue with two messages.

    이 예제에서는 메시지에 고유한 ID가 지정되었고 메시지 텍스트 열에 책갈피가 JSON 형식으로 표시됩니다. Azure docs 책갈피에 대한 메시지가 데이터베이스에 이미 존재하기 때문에 추가하려는 메시지가 없습니다.

  5. 테스트 창에서 요청 본문을 새 ID/URL 세트로 변경하고 함수를 실행하여 함수를 추가로 테스트할 수 있습니다. 이 큐를 조사하여 더 많은 메시지가 도착하는지 확인합니다. 데이터베이스를 보고 새 항목이 추가되었는지 확인할 수도 있습니다.

이 연습에서는 출력 바인딩에 대한 바인딩과 Azure Cosmos DB에 데이터 쓰기에 대한 지식을 확장했습니다. Azure 큐에 메시지를 게시하는 출력 바인딩을 추가했습니다. 이 예에서는 들어오는 원본에서 다양한 대상으로 데이터를 형성하고 이동하는 데 도움이 되는 바인딩의 진정한 능력을 보여 줍니다. 데이터베이스 코드를 작성하지 않았거나 연결 문자열을 직접 관리해야 했습니다. 대신 바인딩을 선언적으로 구성하고 플랫폼이 연결 보안, 함수 스케일링 및 연결 스케일링을 처리하도록 했습니다.