Azure의 Spring Cloud 함수

이 문서에서는 Spring Cloud 함수를 사용하여 Java 함수를 개발하여 Azure Functions에 게시하는 방법을 안내합니다. 완료되면 함수 코드는 Azure의 소비 계획 에서 실행되며 HTTP 요청을 사용하여 트리거될 수 있습니다.

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

사전 요구 사항

Java를 사용하여 함수를 개발하려면 다음이 설치되어 있어야 합니다.

Important

  1. 이 빠른 시작을 완료하려면 환경 변수를 JDK의 설치 위치로 설정 JAVA_HOME 해야 합니다.
  2. 핵심 도구 버전이 4.0.5455 이상인지 확인합니다.

빌드할 내용

Azure Functions에서 실행되고 Spring Cloud Function으로 구성된 클래식 "Hello, World" 함수를 빌드하겠습니다.

함수는 사용자 이름을 포함하는 JSON 개체를 수신 User 하고 해당 사용자에게 환영 메시지를 포함하는 개체를 다시 Greeting 보냅니다.

이 프로젝트는 GitHub의 azure-function-java-worker 리포지토리의 Azure 샘플에 있는 Spring Cloud Function에서 사용할 수 있습니다. 이 빠른 시작에 설명된 최종 작업을 보려면 이 샘플을 직접 사용할 수 있습니다.

새 Maven 프로젝트 만들기

빈 Maven 프로젝트를 만들고 Spring Cloud Function 및 Azure Functions를 사용하여 구성하겠습니다.

빈 폴더에 새 pom.xml 파일을 만들고 샘플 프로젝트의 pom.xml 파일에서 콘텐츠를 복사하여 붙여넣습니다.

참고 항목

이 파일은 Spring Boot 및 Spring Cloud 함수의 Maven 종속성을 사용하며 Spring Boot 및 Azure Functions Maven 플러그인을 구성합니다.

애플리케이션에 대한 몇 가지 속성을 사용자 지정해야 합니다.

  • <functionAppName> 은 Azure Function의 이름입니다.
  • <functionAppRegion> 은 함수가 배포된 Azure 지역의 이름입니다.
  • <functionResourceGroup> 은 사용 중인 Azure 리소스 그룹의 이름입니다.

다음 예제와 같이 pom.xml 파일의 맨 위에서 바로 해당 속성을 변경합니다.

    <properties>
        <java.version>11</java.version>

        <!-- Spring Boot start class. WARNING: correct class must be set -->
        <start-class>com.example.DemoApplication</start-class>

        <!-- customize those properties. WARNING: the functionAppName should be unique across Azure -->
        <azure.functions.maven.plugin.version>1.29.0</azure.functions.maven.plugin.version>
        <functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>
        <functionAppServicePlanName>my-spring-function-service-plan</functionAppServicePlanName>
        <functionAppName>my-spring-function</functionAppName>
        <functionPricingTier>Y1</functionPricingTier>
        <functionAppRegion>eastus</functionAppRegion>
    </properties>

Azure 구성 파일 만들기

src/기본/resources 폴더를 만들고 다음 Azure Functions 구성 파일을 추가합니다.

host.json:

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.2.0)"
  },
  "functionTimeout": "00:10:00"
}

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "FUNCTIONS_EXTENSION_VERSION": "~4",
    "AzureWebJobsDashboard": ""
  }
}

도메인 개체 만들기

Azure Functions는 JSON 형식으로 개체를 수신하고 보낼 수 있습니다. 이제 do기본 모델을 나타내는 개체와 Greeting 개체를 만들 User 겠습니다. 이 빠른 시작을 사용자 지정하고 더 흥미로운 개체를 만들려면 더 많은 속성을 사용하여 더 복잡한 개체를 만들 수 있습니다.

src/기본/java/com/example/model 폴더를 만들고 다음 두 파일을 추가합니다.

User.java:

package com.example.model;

public class User {

    private String name;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Greeting.java:

package com.example.model;

public class Greeting {

    private String message;

    public Greeting() {
    }

    public Greeting(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Spring Boot 애플리케이션 만들기

이 애플리케이션은 모든 비즈니스 논리를 관리하고 전체 Spring Boot 에코시스템에 액세스할 수 있습니다. 이 기능은 표준 Azure Function보다 두 가지 기본 이점을 제공합니다.

  • Azure Functions API를 사용하지 않으므로 다른 시스템에 쉽게 이식할 수 있습니다. 예를 들어 일반 Spring Boot 애플리케이션에서 다시 사용할 수 있습니다.
  • Spring Boot의 @Enable 모든 주석을 사용하여 새 기능을 추가할 수 있습니다.

src/기본/java/com/example 폴더에서 일반적인 Spring Boot 애플리케이션인 다음 파일을 만듭니다.

DemoApplication.java:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(DemoApplication.class, args);
    }
}

이제 src/기본/java/com/example/hello 폴더에 다음 파일을 만듭니다. 이 코드에는 실행할 함수를 나타내는 Spring Boot 구성 요소가 포함되어 있습니다.

Hello.java:

package com.example.hello;

import com.example.model.*;
import org.springframework.stereotype.Component;
import java.util.function.Function;

@Component
public class Hello implements Function<User, Greeting> {

    @Override
    public Greeting apply(User user) {
        return new Greeting("Hello, " + user.getName() + "!\n");
    }
}

참고 항목

Hello 함수는 매우 구체적입니다.

  • java.util.function.Function입니다. 여기에는 비즈니스 논리가 포함되며 표준 Java API를 사용하여 한 개체를 다른 개체로 변환합니다.
  • 주석이 @Component 있기 때문에 Spring Bean이며 기본적으로 이름은 클래스와 동일하지만 소문자로 hello시작합니다. 애플리케이션에서 다른 함수를 만들려면 이 명명 규칙을 따르는 것이 중요합니다. 이름은 다음 섹션에서 만들 Azure Functions 이름과 일치해야 합니다.

Azure 함수 만들기

전체 Azure Functions API를 활용하기 위해 이제 이전 단계에서 만든 Spring Cloud Function에 실행을 위임하는 Azure Function을 코딩합니다.

src/기본/java/com/example/hello 폴더에서 다음 Azure Function 클래스 파일을 만듭니다.

HelloHandler.java:

package com.example.hello;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.example.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class HelloHandler {

    @Autowired
    private Hello hello;

    @FunctionName("hello")
    public HttpResponseMessage execute(
        @HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, ExecutionContext context) {
        User user = request.getBody()
                           .filter(u -> u.getName() != null)
                           .orElseGet(() -> new User(request.getQueryParameters().getOrDefault("name", "world")));
        context.getLogger().info("Greeting user name: " + user.getName());
        return request.createResponseBuilder(HttpStatus.OK)
                      .body(hello.apply(user))
                      .header("Content-Type", "application/json")
                      .build();
    }
}

이 Java 클래스는 다음과 같은 흥미로운 기능을 갖춘 Azure Function입니다.

  • 클래스에는 주석이 @Component 있으므로 Spring Bean입니다.
  • 주석에 정의된 @FunctionName("hello") 함수의 이름은 .입니다 hello.
  • 클래스는 실제 Azure Function을 구현하므로 여기에서 전체 Azure Functions API를 사용할 수 있습니다.

단위 테스트 추가

이 단계는 선택 사항이지만 애플리케이션이 올바르게 작동하는지 확인하는 것이 좋습니다.

src/test/java/com/example 폴더를 만들고 다음 JUnit 테스트를 추가합니다.

HelloTest.java:

package com.example;

import com.example.hello.Hello;
import com.example.model.Greeting;
import com.example.model.User;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class HelloTest {

    @Test
    public void test() {
        Greeting result = new Hello().apply(new User("foo"));
        assertThat(result.getMessage()).isEqualTo("Hello, foo!\n");
    }
}

이제 Maven을 사용하여 Azure Function을 테스트할 수 있습니다.

mvn clean test

함수를 로컬로 실행

Azure Function에 애플리케이션을 배포하기 전에 먼저 로컬에서 테스트해 보겠습니다.

먼저 애플리케이션을 Jar 파일로 패키지해야 합니다.

mvn package

이제 애플리케이션이 패키지되었으므로 Maven 플러그 인을 azure-functions 사용하여 실행할 수 있습니다.

mvn azure-functions:run

이제 포트 7071을 사용하여 localhost에서 Azure 함수를 사용할 수 있습니다. JSON 형식의 개체를 사용하여 POST 요청을 전송하여 함수를 User 테스트할 수 있습니다. 예를 들어 cURL 사용:

curl -X POST http://localhost:7071/api/hello -d "{\"name\":\"Azure\"}"

함수는 여전히 JSON 형식으로 Greeting 개체를 사용하여 응답해야 합니다.

{
  "message": "Hello, Azure!\n"
}

다음은 화면 맨 위에 있는 cURL 요청 및 아래쪽의 로컬 Azure 함수 스크린샷입니다.

Azure Function running locally

함수를 로컬로 디버그

다음 섹션에서는 함수를 디버그하는 방법을 설명합니다.

Intellij IDEA를 사용하여 디버그

Intellij IDEA에서 프로젝트를 연 다음, 연결할 원격 JVM 디버그 실행 구성을 만듭니다. 자세한 내용은 자습서: 원격 디버그를 참조하세요.

Create a Remote JVM Debug run configuration

다음 명령을 사용하여 애플리케이션을 실행합니다.

mvn azure-functions:run -DenableDebug

애플리케이션이 시작되면 다음과 같은 출력이 표시됩니다.

Worker process started and initialized.
Listening for transport dt_socket at address: 5005

IntelliJ IDEA에서 프로젝트 디버깅을 시작합니다. 다음 출력이 표시됩니다.

Connected to the target VM, address: 'localhost:5005', transport: 'socket'

디버그할 중단점을 표시합니다. Intellij IDEA는 요청을 보낸 후 디버깅 모드로 전환됩니다.

Visual Studio Code를 사용한 디버그

Visual Studio Code에서 프로젝트를 열고 다음 launch.json 파일 콘텐츠를 구성합니다.

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Attach to Remote Program",
            "request": "attach",
            "hostName": "127.0.0.1",
            "port": 5005
        }
    ]
}

다음 명령을 사용하여 애플리케이션을 실행합니다.

mvn azure-functions:run -DenableDebug

애플리케이션이 시작되면 다음과 같은 출력이 표시됩니다.

Worker process started and initialized.
Listening for transport dt_socket at address: 5005

Visual Studio Code에서 프로젝트 디버깅을 시작한 다음 디버그하려는 중단점을 표시합니다. Visual Studio Code는 요청을 보낸 후 디버깅 모드로 전환됩니다. 자세한 내용은 Java 실행 및 디버깅을 참조 하세요.

Azure Functions에 함수 배포

이제 프로덕션에 Azure Function을 게시합니다. <functionAppName>pom.xml 파일에서 정의한 , <functionAppRegion><functionResourceGroup> 속성은 함수를 구성하는 데 사용됩니다.

참고 항목

Maven 플러그 인은 Azure를 사용하여 인증해야 합니다. Azure CLI가 설치된 경우 계속하기 전에 az login를 사용합니다. 더 많은 인증 옵션은 azure-maven-plugins 리포지토리의 인증을 참조하세요.

Maven을 실행하여 함수를 자동으로 배포합니다.

mvn azure-functions:deploy

이제 Azure Portal이동하여 생성된 항목을 찾 Function App 습니다.

함수를 선택합니다.

  • 함수 개요에서 함수의 URL을 확인합니다.
  • 실행 중인 함수를 검사 탐색 메뉴에서 로그 스트리밍을 선택합니다.

이제 이전 섹션에서 했던 것처럼 다음 예제와 같이 cURL을 사용하여 실행 중인 함수에 액세스합니다. 실제 함수 이름으로 대체 your-function-name 해야 합니다.

curl https://your-function-name.azurewebsites.net/api/hello -d "{\"name\":\"Azure\"}"

이전 섹션과 마찬가지로 함수는 JSON 형식인 개체로 Greeting 응답해야 합니다.

{
  "message": "Hello, Azure!\n"
}

축하합니다. Azure Functions에서 Spring Cloud Function이 실행되고 있습니다. Spring Cloud 함수에 대한 자세한 내용 및 샘플은 다음 리소스를 참조하세요.

다음 단계

Spring 및 Azure에 대해 자세히 알아보려면 Spring on Azure 설명서 센터를 계속 진행하세요.