웹앱

완료됨

사용자 지정 처리기를 사용하려면 웹 애플리케이션을 작성해야 합니다. 애플리케이션을 작성하고 컴파일한 후에는 그 사용법을 알 수 있도록 Azure Functions 호스트를 구성해야 합니다. 이에 관한 자세한 내용은 나중에 살펴보겠습니다. 먼저, 웹 애플리케이션을 어떻게 빌드할까요?

Go에서 REST API 빌드

Go를 사용하여 REST API를 빌드하려면 다음 몇 가지 사항을 알아야 합니다.

  • 라이브러리를 가져옵니다. 라이브러리 fmt, lognet/http를 사용합니다. 이러한 라이브러리는 경로를 관리하고, 들어오는 요청을 처리하고, 로깅을 처리하는 데 도움이 됩니다. 다음 import 문을 사용합니다.

    import (
       "fmt",
       "log",
       "net/http"
    )    
    
  • 라우팅을 설정합니다. REST API는 경로라고 하는 논리 분할로 구성됩니다. 경로는 앱의 특정 문제에 응답하는 주소입니다. 경로를 설정하려면 http 인스턴스에서 HandleFunc() 메서드를 호출하고 경로를 정의하여 요청에 응답합니다.

    http.HandleFunc("/", handleRoute)   
    

    이 경우 handleRoute 함수를 만들어 경로 "/"에 들어오는 요청을 일치시켜야 합니다.

  • 요청을 관리합니다. 들어오는 요청을 관리하고, 라우터 또는 쿼리 매개 변수나 게시된 본문과 같은 항목을 읽어야 합니다. 그런 다음 응답을 생성해야 합니다. 요청을 처리하는 함수는 다음과 같을 수 있습니다.

    func handleRequest(w: http:ResponseWriter, r: http.Request) {
        fmt.Fprintf(w, "My first REST API") 
    }
    

    이 코드는 호출하는 클라이언트로 "My first REST API" 텍스트를 다시 보냅니다. 메서드 Fprintf()는 두 가지 인수, 즉 응답 스트림과 다시 보낼 문자열을 사용합니다.

  • 서버를 만듭니다. 요청을 수신 대기할 수 있으려면 서버를 시작해야 합니다. 요청을 보낼 수 있는 파트도 지정해야 합니다. 다음 코드로 서버를 만들 수 있습니다.

    http.ListenAndServe(":3000", nil)
    

    이제 서버가 작동하여 포트 3000에서 요청 수신을 대기할 수 있습니다.

Azure Functions 앱 만들기

Azure Functions 앱을 개발하기 전에 다음을 수행하는 것이 좋습니다.

Visual Studio Code를 사용하여 Functions 앱 스캐폴드

필요한 모든 종속성을시스템에 설치한 후에는 애플리케이션을 스캐폴드합니다. 런타임에 관한 메시지가 표시되면 사용자 지정 처리기를 선택합니다.

이제 정확한 파일이 생성될 것입니다. 이 방식으로 프로젝트를 생성할 때는 첫 번째 함수의 트리거 형식을 선택해야 합니다. 사용자 지정 처리기는 일반적인 트리거 및 바인딩 모두에서 작동합니다.

프로젝트 생성을 완료한 후에는 앱에 다음 파일이 포함됩니다.

  • host.json
  • local.setting.json
  • proxies.json
  • function.json

function.json 파일은 이름이 첫 번째 함수에 지정한 이름과 동일한 디렉토리에 있습니다. 이 파일을 사용하여 함수를 구성합니다.

프로젝트 구성

앱이 HTTP 기본 형식으로 작업하려면 다음 몇 가지를 구성해야 합니다.

  • 사용자 지정 처리기 포트를 수신 대기합니다. 앱에서 특정 포트를 수신 대기해야 합니다. 변수 FUNCTIONS_CUSTOMHANDLER_PORT에 필요한 값이 포함되어 있습니다. 다음 코드를 사용하여 포트 값을 조회할 수 있습니다.

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    
  • 기본 실행 파일 경로를 구성합니다. 실행 파일을 빌드하는 중이므로 Functions 앱 프로젝트에 그 위치를 알려주어야 합니다.

    프로젝트 루트에서 function.json 파일을 찾습니다. customHandler 섹션에서 defaultExecutablePath를 지정합니다. 가능한 형태 예시는 다음과 같습니다.

    "customHandler": {
       "defaultExecutablePath": "mygoapp.exe"
    }
    
  • 요청 전달을 사용하도록 설정합니다. HTTP 트리거를 사용하는 함수를 처리할 때는 유형이 다른 트리거(예: 큐 트리거)를 처리할 때와 약간 다르게 앱을 구성해야 합니다.

    enableForwardingHttpRequest라는 속성을 사용하도록 설정합니다. 이 속성을 설정하면 다음과 같이 요청을 처리하는 방식이 달라집니다.

    • 원래 요청의 복사본. HTTP 요청에 사용자 지정 처리기 요청 페이로드가 포함되지 않습니다. 대신 Functions 호스트에서 원래 HTTP 요청의 복사본을 사용하여 처리기를 호출합니다.

    • 원래 요청과 동일한 경로. Functions 호스트가 원래 요청과 동일한 경로로 처리기를 호출합니다.

      경로 및 경로 처리기를 정의할 때 라우팅을 설정하는 방식을 구체적으로 지정해야 합니다. 프로젝트 개요가 다음과 같다고 가정하겠습니다.

      hello/
        function.json   
      

      개요의 파일이 기본적으로 경로 /api/hello에 매핑됩니다. 경로를 설정하는 코드에서 전체 경로를 지정해야 합니다.

      mux.HandleFunc("/api/hello", helloHandler)
      

      이 설정을 사용하지 않도록 설정한 경우 다른 유형의 트리거와 바인딩에 대해 라우터 코드를 "/hello"로 지정하는 것으로 충분할 것입니다.

    • 처리기 응답의 복사본. Functions 호스트는 처리기의 HTTP 응답 복사본을 원래 요청에 대한 응답으로 반환합니다.

앞 예제에서 실행 파일은 mygoapp.exe입니다. 이 예제에서는 mygoapp.go라는 파일에서 실행 파일을 만들지만 원하는 Go 파일 이름을 원하는 대로 지정할 수 있다고 가정합니다. Linux 또는 macOS에서 실행 파일에 확장명이 없습니다.

앱을 빌드합니다.

이 경우에 웹 앱을 빌드하는 것은 Go를 사용하여 웹 앱을 빌드하는 것과 크게 다르지 않습니다. 앞 섹션에 설명한 구성을 완료했으면 준비가 되어 있는 것입니다.

이제 다음 단계를 수행해야 합니다.

  1. 포트를 읽습니다.
  2. HTTP 서버 인스턴스를 인스턴스화합니다.
  3. 경로 및 경로 처리기를 정의합니다.
  4. 포트에서 수신 대기를 시작합니다.
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
if !exists {
   customHandlerPort = "8080"
} // 1)
mux := http.NewServeMux() // 2)
mux.HandleFunc("/order", orderHandler) // 3)
fmt.Println("Go server Listening on: ", customHandlerPort)
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) // 4)