본문 바로가기
Spring/SpringBoot

[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (1) - Spring 세팅 및 로컬 테스트

by J4J 2023. 4. 28.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 AWS Lambda와 API Gateway로 Serverless 구성하기의 첫 번째인 Spring 세팅 및 로컬 테스트에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

Serverless 란?

 

Serverless는 개발자가 서버를 직접 관리하지 않아도 애플리케이션을 배포하여 사용자에게 서비스를 제공해 주는 개발 모델을 의미합니다.

 

Serverless의 특징들은 다음과 같이 있습니다.

 

  • 개발자는 배포를 위한 부분만 신경쓰도록 도와줌
  • 배포를 제외한 유지 관리 및 스케일링 등을 자체적으로 관리해 줌
  • 사용자가 없으면 활성화되어 있지 않음
  • 사용자가 생기면 활성화되었다가 모든 요청이 처리되면 대기 상태로 전환
  • 서버가 동작되는 시간이 아니라 활성화되어 있는 시간에 비례하여 비용을 계산하기 때문에 사용하지 않을 때는 비용이 발생하지 않음
  • 사용자가 생길 때 활성화를 해주는 시간이 필요하기에 응답에 대한 일정 시간이 필요
  • AWS에서 제공해 주는 대표적인 기능으로 Lambda가 있음

 

 

반응형

 

 

Spring 세팅

 

Spring에서 Lambda에 배포할 비즈니스 로직을 구성해 보겠습니다.

 

Gradle을 이용할 것이며 다음 순서대로 진행해 주시면 됩니다.

 

 

 

[ 1. 신규 프로젝트 생성 ]

 

각자 작업하실 프로젝트를 생성해 주시면 됩니다.

 

다만 여기서 제가 하는 설정 방법으로는 프로젝트를 생성할 때 Lombok과 Spring Web을 dependency로 추가해주셔야 합니다.

 

신규 프로젝트 생성

 

 

 

[ 2. 의존성 추가 ]

 

dependencies {
	// Lambda Local
	implementation 'org.springframework.cloud:spring-cloud-function-web:3.2.8'
}

 

 

 

[ 3. Function 추가 ]

 

Lambda 비즈니스 로직 구성을 위해 Java8부터 등장하여 사용되는 인터페이스는 다음과 같이 총 3가지가 있습니다.

 

  • Function → 1개의 파라미터를 전달받을 수 있고, 결괏값을 리턴할 수 있음
  • Consumer → 1개의 파라미터를 전달받을 수 있음
  • Supplier → 결괏값을 리턴할 수 있음

 

 

 

이들은 일반적인 Rest API를 구축할 때 Controller에 구성하는 EndPoint의 역할을 수행한다고 보시면 됩니다.

 

그리고 저는 다음과 같이 코드를 작성해 보겠습니다.

 

package com.lambda.apigateway.function;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

@Component
@Slf4j
public class LambdaApiGatewayFunction implements Function<Map<String, Object>, List<String>> {

    @Override
    public List<String> apply(Map<String, Object> map) {
        log.info("lambda apply 수행");

        List<String> strings = new ArrayList<>();
        strings.add(map.get("title").toString());
        strings.add(map.get("name").toString());
        strings.add("sample");

        log.info("lambda apply 종료");

        return strings;
    }
}

 

 

 

[ 4. Function Bean 생성 ]

 

위에서 생성한 Function을 Bean으로 등록을 해줍니다.

 

등록하는 곳은 Application 파일 쪽에 다음과 같이 해주시면 됩니다.

 

package com.lambda.apigateway;

import com.lambda.apigateway.function.LambdaApiGatewayFunction;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

@SpringBootApplication
public class LambdaApiGatewayApplication {

    @Bean
    public Function<Map<String, Object>, List<String>> lambdaApiGatewayFunctionBean() {
        return new LambdaApiGatewayFunction();
    }

    public static void main(String[] args) {
        SpringApplication.run(LambdaApiGatewayApplication.class, args);
    }
}

 

 

 

 

로컬 테스트

 

Lambda 배포에 사용될 코드를 위와 같이 작성한 뒤 정상 동작 하는지에 대해 테스트해 보겠습니다.

 

request를 전달할 땐 method는 POST로 해야 하며 url은 서버 도메인 + Application에 등록한 Bean 이름으로 주시면 됩니다.

 

그리고 request와 함께 전달할 데이터들은 일반적인 POST 요청처럼 Body에 담아주시면 됩니다.

 

그러면 위의 코드를 기준으로 다음과 같은 요청을 전달할 수 있습니다.

 

테스트 결과

 

 

 

또한 로그도 아래와 같이 정상적으로 찍히는 것을 확인할 수 있습니다.

 

2023-04-28 00:04:22.543  INFO 25420 --- [nio-8080-exec-1] c.l.a.function.LambdaApiGatewayFunction  : lambda apply 수행
2023-04-28 00:04:22.543  INFO 25420 --- [nio-8080-exec-1] c.l.a.function.LambdaApiGatewayFunction  : lambda apply 종료

 

 

 

 

 

 

 

 

이상으로 AWS Lambda와 API Gateway로 Serverless 구성하기의 첫 번째인 Spring 세팅 및 로컬 테스트에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글