SpringBoot AWS Lambda에 배포하기 (2) - 테스트(API 호출 응답 확인하기)
지난 글
https://seungboo.tistory.com/15
SpringBoot를 AWS SAM CLI를 활용하여 aws에 배포하였으므로 정상적으로 동작하는 지 테스트를 해봐야 한다.
데이터를 RDS에 저장하고 API를 호출하여 응답을 받는 것을 목표로 한다.
1. 테스트데이터 만들기
테스트를 위해 간단한 MemberEntity, Cotroller, Repository(JPA), 애플리케이션 실행 시 DB에 데이터를 넣는 InitData 클래스를 만든다.
package com.study.springlambda.controller;
import com.study.springlambda.entity.Member;
import com.study.springlambda.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
@GetMapping("/members")
public List<Member> findAll() {
return memberRepository.findAll();
}
}
package com.study.springlambda.entity;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
public Member(String username, int age) {
this.username = username;
this.age = age;
}
}
package com.study.springlambda;
import com.study.springlambda.entity.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Component
@RequiredArgsConstructor
public class InitData {
private final InitDataService initDataService;
@PostConstruct
public void init() {
initDataService.init();
}
@Component
static class InitDataService {
@PersistenceContext
private EntityManager em;
@Transactional
public void init() {
for (int i = 0; i < 20; i++) {
em.persist(new Member("member" + i, i));
}
}
}
}
2. 다시 빌드 - 배포를 진행한다.
sam build
sam deploy --guided
3. API 호출 하기
API Gateway > 스테이지 > Prod를 누르면 API 호출 URL을 확인 할 수 있다.
URL + /members로 위에서 만든 api를 호출해보자. 아래와 같은 순서로 동작할 것이다.
1. API Gateway가 받은 요청을 Lambda로 보낸다
2. Lambda Handler가 요청을 전달 받고 이어서 SpringbootApplication을 실행시킨다.
3. InitDB 클래스에 의해 RDS에 Member 데이터가 저장된다.
4. Controller가 요청을 받아 findAll()을 수행하여 멤버데이터를 가져와 반환한다.
Postman을 활용하여 API를 호출하였다.
2-3-4의 과정을 거쳐 정상적으로 동작한 모습이다! (그런데 시간이 12.46초나 걸렸다...)
DBeaver로 확인해보자. 데이터베이스에도 테스트데이터가 잘 저장되어 있다.
이렇게 API Gateway, SpringBoot, Lambda, RDS를 연동하여 데이터를 저장하고 가져오는 동작을 구현하였다.
하지만 위에서도 볼 수 있듯, 시간이 12.46초나 걸린다는 문제가 있다.
기본적으로 Lambda는 최초 실행의 경우 cold start로 인해 동작에 시간이 소요될뿐 더러, spring boot application이 실행되는 시간도 있기 때문에 시간이 오래걸리는 것 같다.
Lambda가 깨어있지 않은 상황에서는 약 12초나 시간이 걸린다니 이 문제를 해결하기 위해서 snap start를 적용하고자 한다.