본문 바로가기
GD's IT Lectures : 기초부터 시리즈/스프링부트(Spring Boot) 기초부터 ~

[스프링 부트(SpringBoot) : 고급] 서버리스 아키텍처와 스프링 부트

by GDNGY 2023. 5. 6.

9. 서버리스 아키텍처와 스프링 부트

서버리스 아키텍처는 서버 인프라를 관리하거나 프로비저닝 할 필요 없이, 애플리케이션을 빌드 및 배포하는 방식을 의미합니다. 이를 통해 개발자는 애플리케이션 개발에 집중할 수 있습니다. 스프링 부트는 서버리스 아키텍처와 통합하여, AWS Lambda와 Azure Functions와 같은 클라우드 기반의 서버리스 플랫폼에서도 애플리케이션을 구축할 수 있습니다.

 

9.1. 서버리스 아키텍처 소개

서버리스 아키텍처는 클라우드 서비스 제공 업체가 인프라스트럭처를 관리하며, 개발자는 애플리케이션 코드에 집중할 수 있는 방식입니다. 이를 통해 애플리케이션 개발 생산성과 확장성을 향상할 수 있습니다. 서버리스 아키텍처는 클라우드 기반의 함수 서비스(FaaS) 및 백그라운드 작업을 실행하는 시스템 등으로 구성됩니다. 

 

9.2. 스프링 부트와 AWS Lambda 통합

AWS Lambda는 클라우드 기반의 FaaS 서비스로, 개발자는 함수 코드를 업로드하고 실행할 수 있습니다. 스프링 부트와 AWS Lambda를 통합하면 스프링 부트 애플리케이션을 람다 함수로 실행할 수 있습니다. 이를 위해서는 AWS Lambda 커스텀 런타임과 스프링 부트 애플리케이션을 패키징하여 배포해야 합니다. 또한, 스프링 부트 애플리케이션을 람다 함수로 변환하기 위해 AWS Lambda 프락시를 사용할 수 있습니다. 

 

  1. AWS Lambda와 스프링 부트 애플리케이션 패키징
AWS Lambda에서 스프링 부트 애플리케이션을 실행하려면 해당 애플리케이션을 람다 함수로 패키징해야 합니다. 이를 위해서는 AWS Lambda 커스텀 런타임을 사용해야 합니다. 커스텀 런타임은 함수의 실행 컨텍스트를 구성하는 데 사용되며, 함수를 실행할 때마다 호출됩니다. 스프링 부트 애플리케이션을 커스텀 런타임으로 패키징하면, 함수가 호출될 때마다 애플리케이션이 초기화됩니다. 

 

  • AWS Lambda 커스텀 런타임 설정 : AWS Lambda에서 스프링 부트 애플리케이션을 실행하려면 커스텀 런타임 설정이 필요합니다. 먼저, AWS Lambda 함수를 만들어야 합니다. 이 함수에는 런타임을 구성하기 위한 커스텀 런타임 파일이 포함됩니다.
public class LambdaHandler implements RequestHandler<Object, Object> {
    private SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;

    public LambdaHandler() throws ContainerInitializationException {
        handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class);
    }

    @Override
    public Object handleRequest(Object input, Context context) {
        return handler.proxy(input, context);
    }
}

 

위 코드는 AWS Lambda 함수를 구성하는 핸들러 클래스입니다. 핸들러 클래스에서는 스프링 부트 애플리케이션을 구동할 수 있는 SpringBootLambdaContainerHandler를 사용합니다.

 

  • Gradle 빌드 스크립트 구성 : AWS Lambda로 스프링 부트 애플리케이션을 배포하려면 빌드 스크립트를 구성해야 합니다.
plugins {
    id 'org.springframework.boot' version '2.5.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.0'
    implementation 'com.amazonaws:aws-lambda-java-events:3.4.0'
}

bootJar {
    classifier = 'aws'
    mainClassName = 'com.example.demo.LambdaHandler'
    manifest {
        attributes(
                'Spring-Boot-Classes': 'BOOT-INF/classes/',
                'Spring-Boot-Libraries': 'BOOT-INF/lib/',
                'Spring-Boot-Lib': 'org.springframework.boot.loader.JarLauncher'
        )
    }
}

 

위 코드에서는 AWS Lambda와 스프링 부트 애플리케이션을 구동하는 데 필요한 종속성을 구성합니다. 빌드 스크립트에서는 AWS Lambda Java Core 및 AWS Lambda Java Events 라이브러리를 사용합니다. 또한, bootJar 태스크에서는 스프링 부트 애플리케이션을 패키징하고 AWS Lambda 함수에 필요한 속성을 설정합니다. 

 

  • AWS Lambda 함수 배포 : AWS Lambda 함수를 배포하려면 AWS CLI를 사용할 수 있습니다. 아래 명령어를 사용하여 함수를 배포할 수 있습니다.
aws lambda create-function
--function-name MyFunction
--runtime provided
--handler com.example.demo.LambdaHandler
--memory-size 512
--timeout 10
--role arn:aws:iam::123456789012:role/MyLambdaRole
--layers arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1
--zip-file fileb://build/libs/demo-0.0.1-SNAPSHOT-aws.jar

 

위 명령어에서는 create-function 명령을 사용하여 함수를 생성하고 배포합니다. 함수 이름(MyFunction), 런타임(provided), 핸들러(com.example.demo.LambdaHandler), 메모리 크기(512 MB), 타임아웃 시간(10 초), IAM 역할(arn:aws:iam::123456789012:role/MyLambdaRole), 레이어(arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1) 및 함수 코드(zip 파일)를 지정합니다.

 

9.3. 스프링 부트와 Azure Functions 통합

Azure Functions는 클라우드 기반의 FaaS 서비스로, 개발자는 함수 코드를 업로드하고 실행할 수 있습니다. 스프링 부트와 Azure Functions를 통합하면 스프링 부트 애플리케이션을 함수로 실행할 수 있습니다. 이를 위해서는 Azure Functions의 Java 함수 앱을 사용하여 스프링 부트 애플리케이션을 패키징하고 배포해야 합니다. 또한, Azure Functions에서는 스프링 부트 애플리케이션을 구동하는 데 필요한 추가 구성이 필요합니다.

 

  1. Azure Functions와 스프링 부트 애플리케이션 패키징
Azure Functions에서 스프링 부트 애플리케이션을 실행하려면 해당 애플리케이션을 Azure Functions의 Java 함수 앱으로 패키징해야 합니다. 이를 위해서는 Azure Functions Tools를 사용합니다. Azure Functions Tools는 Azure Functions 애플리케이션을 개발하고 배포하기 위한 확장 도구입니다.

 

  • Azure Functions Tools 설치 : Azure Functions Tools를 설치하려면 Visual Studio Code에서 Azure Functions 확장을 설치해야 합니다. Visual Studio Code에서 'Azure Functions'를 검색하고, 확장을 설치합니다.
  • Gradle 빌드 스크립트 구성 : Azure Functions로 스프링 부트 애플리케이션을 배포하려면 빌드 스크립트를 구성해야 합니다. 

아래는 Gradle 빌드 스크립트 예시입니다.

plugins {
    id 'org.springframework.boot' version '2.5.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'com.azure.functions.gradle.plugin' version '1.6.0'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.azure.spring:azure-spring-cloud-starter-function-adapter:2.6.0'
}

azureFunctions {
    appName = 'my-app'
    resourceGroup = 'my-group'
    function {
        name = 'my-function'
        entryPoint = 'com.example.demo.Function'
        bindings {
            http {
                name = 'req'
                direction = 'in'
                authLevel = 'anonymous'
                methods = ['get', 'post']
            }
            http {
                name = 'res'
                direction = 'out'
            }
        }
    }
}

 

위 코드에서는 Azure Functions와 스프링 부트 애플리케이션을 구동하는 데 필요한 종속성을 구성합니다. 빌드 스크립트에서는 Azure Functions Gradle 플러그인 및 Azure Spring Cloud Function Adapter 라이브러리를 사용합니다.

 

azureFunctions 블록에서는 함수 앱의 이름(my-app), 리소스 그룹(my-group), 함수 이름(my-function), 진입점(com.example.demo.Function), 함수 바인딩(http) 등을 구성합니다. 

 

  • Azure Functions 함수 앱 배포 : Azure Functions 함수 앱을 배포하려면 Azure CLI를 사용할 수 있습니다.

아래 명령어를 사용하여 함수 앱을 배포할 수 있습니다.

az login

az functionapp create \
    --resource-group my-group \
    --name my-app \
    --consumption-plan-location koreacentral \
    --runtime java \
    --runtime-version 11 \
    --functions-version 3

az functionapp deployment source config-zip \
    --resource-group my-group \
    --name my-app \
    --src build/azure-functions/demo-0.0.1-SNAPSHOT-azure.jar

 

위 명령어에서는 함수 앱을 생성하고, 함수 앱을 배포합니다. 함수 앱 이름(my-app), 리소스 그룹 이름(my-group), 지역(koreacentral), 런타임(java), 런타임 버전(11), 함수 버전(3) 등을 지정합니다. 또한, 함수 앱 배포를 위해 build/azure-functions/demo-0.0.1-SNAPSHOT-azure.jar 파일을 사용합니다.

 

 

 

2023.05.06 - [프로그래밍/스프링부트(Spring Boot) 기초부터 ~] - [스프링 부트(SpringBoot) : 고급] 스프링 부트와 머신 러닝 통합

 

[스프링 부트(SpringBoot) : 고급] 스프링 부트와 머신 러닝 통합

8. 스프링 부트와 머신 러닝 통합 TensorFlow와 PyTorch를 사용하여 머신 러닝 모델을 개발하고 이를 스프링 부트 애플리케이션에 통합하는 방법을 설명합니다. 이를 통해 기존의 웹 애플리케이션에

gdngy.tistory.com

 

반응형

댓글