안녕하세요. 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 세팅 및 로컬 테스트에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (4) - GitLab으로 Lambda 자동배포하기 (0) | 2023.05.10 |
---|---|
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (2) - Lambda 생성해서 배포하기 (1) | 2023.04.30 |
[SpringBoot] MockMVC를 이용하여 API 테스트하기 (0) | 2023.04.09 |
[SpringBoot] WebClient를 이용하여 외부 API 호출하기 (1) | 2023.03.15 |
[SpringBoot] QueryDSL where절에 1=1 사용하기 (0) | 2023.01.25 |
댓글