본문 바로가기
Spring/SpringBoot

[SpringBoot] AWS Lambda로 배치 만들기 (1) - Spring 세팅 및 로컬 테스트

by J4J 2022. 12. 5.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 AWS Lambad로 배치 만들기 첫 번째인 Spring 세팅 및 로컬 테스트에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

DB 세팅

 

이번에 Lambda를 이용해 만들어보려고 하는 것은 배치를 돌려 주기적으로 DB에 로그 데이터를 적재하는 것입니다.

 

그러므로 로그 데이터 적재를 위해 사용될 테이블을 생성하도록 하겠습니다.

 

테이블을 생성하기에 앞서 Lambda에 작업한 코드를 배포하기 때문에 로컬에서 사용하는 DB로 해주시면 안 됩니다.

 

[AWS] RDS로 MySQL 사용 환경 구성과 같은 글들을 참고하여 로컬이 아닌 서버에서 DB를 생성해주시면 됩니다.

 

데이터 적재를 위해 사용될 DB 스키마는 다음과 같습니다.

 

create table lambda_log (
    no bigint primary key auto_increment,
    create_id varchar(100),
    create_at datetime
);

 

 

반응형

 

 

Spring 세팅

 

Spring에서는 Lambda에서 실행될 비즈니스 로직을 구성해주면 됩니다.

 

다음 절차들을 통해 세팅해보도록 하겠습니다.

 

 

 

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

 

각자 작업하는 방식으로 신규 SpringBoot 프로젝트를 생성해주시면 됩니다.

 

다만 여기서 저의 설정 방법으로는 dependency로 Lombok과 Spring Web을 필수로 추가해주셔야 합니다.

 

신규 프로젝트 생성

 

 

 

[ 2. 의존성 추가 ]

 

작성한 Lambda에 배포될 코드가 정상적으로 동작되는지를 로컬에서 테스트하기 위한 의존성이 필요합니다.

 

다음 dependency를 추가해주시면 됩니다.

 

<!-- Lambda 로컬 테스트 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-function-web</artifactId>
    <version>3.2.8</version>
</dependency>

 

 

 

[ 3. 비즈니스 로직 추가 ]

 

이제 각자의 방식으로 DB에 데이터 적재를 위한 비즈니스 로직을 구성하시면 됩니다.

 

저는 JPA를 이용하여 다음과 같이 구성했으니 필요하신 분만 참고하시면 됩니다.

 

package com.lambda.batch.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "lambda_log")
public class LambdaLogEntity {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long no;
    private String createId;
    private String createAt;
}

 

package com.lambda.batch.repository;

import com.lambda.batch.entity.LambdaLogEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LambdaLogJpaRepository extends JpaRepository<LambdaLogEntity, Long> {

}

 

package com.lambda.batch.service;

import com.lambda.batch.entity.LambdaLogEntity;

import java.util.List;

public interface LambdaLogService {

    public List<LambdaLogEntity> register(List<LambdaLogEntity> lambdaLogEntityList);
}

 

package com.lambda.batch.service.impl;

import com.lambda.batch.entity.LambdaLogEntity;
import com.lambda.batch.repository.LambdaLogJpaRepository;
import com.lambda.batch.service.LambdaLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class LambdaLogServiceImpl implements LambdaLogService {

    @Autowired
    private LambdaLogJpaRepository lambdaLogJpaRepository;

    @Override
    public List<LambdaLogEntity> register(List<LambdaLogEntity> lambdaLogEntityList) {
        // 저장
        List<LambdaLogEntity> resLambdaLogEntityList = lambdaLogJpaRepository.saveAll(lambdaLogEntityList);

        // 결과 반환
        return resLambdaLogEntityList;
    }
}

 

 

 

 

[ 4. Consumer 추가 ]

 

Lambda 처리를 위해 사용되는 인터페이스는 다음과 같이 총 3가지가 있습니다.

 

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

 

 

 

Java8에서 등장한 인터페이스이기 때문에 관련된 자료를 자세하게 확인해보고 싶으신 분들은 조금만 검색하셔도 많은 정보들을 확인하실 수 있습니다.

 

저는 여기서 Consumer를 이용하도록 하겠습니다.

 

Consumer는 사용하기 위해서 accept 메서드가 필수적으로 정의되어야 합니다.

 

accept 메서드에서는 Consumer가 전달받은 파라미터를 확인할 수 있고 그에 따른 결과 처리를 진행할 수 있게 도와줍니다.

 

 

 

저는 accept에 다음과 같이 서로 다른 날짜 포맷팅이 적용되어 저장되는 코드를 사용하겠습니다

 

package com.lambda.batch.consumer;

import com.lambda.batch.entity.LambdaLogEntity;
import com.lambda.batch.service.LambdaLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

@Component
@Slf4j
public class LambdaLogConsumer implements Consumer<Object> {

    @Autowired
    private LambdaLogService lambdaLogService;

    @Override
    public void accept(Object o) {
        List<LambdaLogEntity> lambdalLogEntityList = Arrays.asList(
                new LambdaLogEntity(0, "yyyyMMddHHmmss pattern", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))),
                new LambdaLogEntity(0, "yyyyMMdd pattern", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
        );

        List<LambdaLogEntity> resLambdaLogEntityList = lambdaLogService.register(lambdalLogEntityList);
        if(resLambdaLogEntityList != null) {
            log.info("저장된 데이터 갯수 : " + resLambdaLogEntityList.size() + " 개");
        }
    }
}

 

 

 

[ 5. Consumer Bean 생성 ]

 

이제 작성된 Consumer가 사용될 수 있게 Consumer Bean을 Application 파일 쪽에 생성하겠습니다.

 

package com.lambda.batch;

import com.lambda.batch.consumer.LambdaLogConsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.function.Consumer;

@SpringBootApplication
public class LambdaBatchApplication {

	@Bean
	public Consumer<Object> lambdaLogConsumerBean() {
		return new LambdaLogConsumer();
	}

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

}

 

 

 

 

로컬 테스트

 

Lambda에 배포될 코드가 정상적으로 동작되는지 로컬에서 테스트해보겠습니다.

 

서버에 request를 전달할 tool을 준비해주시면 되고 저는 포스트맨을 활용하겠습니다.

 

 

 

서버에 request를 보낼 때 http method는 POST로 전달해주셔야 합니다.

 

그리고 url은 서버 도메인 + Bean으로 등록한 함수명으로 해주시면 됩니다.

 

즉, 위의 코드 기준으로 포스트맨으로 request 내용을 작성할 때 다음과 같이 작성될 수 있습니다.

 

포스트맨 request 처리

 

 

 

모든 설정이 완료되었다면 request를 전달하시면 되고 정상 수행이 될 경우 다음과 같은 Spring 로그가 찍히면서 데이터가 적재되는 것을 확인할 수 있습니다.

 

Hibernate: 
    insert 
    into
        lambda_log
        (create_at, create_id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        lambda_log
        (create_at, create_id) 
    values
        (?, ?)
2022-12-12 00:47:07.900  INFO 13200 --- [nio-8080-exec-2] c.l.batch.consumer.LambdaLogConsumer     : 저장된 데이터 갯수 : 2 개

 

데이터 적재

 

 

 

 

 

 

 

이상으로 AWS Lambad로 배치 만들기 첫 번째인 Spring 세팅 및 로컬 테스트에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글