@Scheduled
만 사용하면 되는 걸까?@Scheduled
어노테이션을 메서드에 붙여주면 특정 시간마다 작업을 실행할 수 있다.
작은 규모의 작업이라면 괜찮지만, 대규모 메일 전송 작업에는 여러 문제가 있다.
❓ 우리는 어차피 서버(EC2)가 1개인데?
- 대규모 데이터를 다루는 과정 속에서 사용자 요청이 들어왔을 때, 서버가 버틸 수 있을까? 느려지지는 않을까?
위와 같은 문제점들 때문에 우리는 안정적으로 서버를 실행시킬 수 있는 구조가 필요했다.
바로 배치 어플리케이션 프레임워크인 Spring Batch이다.
❓ vs 웹 어플리케이션과의 차이점
웹 어플리케이션은 사용자 요청에 따라 항상 실행 상태이어야 한다.
배치 어플리케이션은 정해진 작업(Job)이 끝나면 종료되면 된다.
💡 스프링 배치를 사용함으로서, 부가적인 고민들을 프레임워크에 맡기거나 지원받고, 개발자는 비즈니스 로직에만 집중할 수 있게 된다!
Spring Batch 로직만 작성한다고 자동으로 실행되진 않는다.
정해진 시간에 트리거(trigger)가 배치 애플리케이션을 실행해줘야 한다.
똑같은 스프링 프로젝트가 있을 때, CLI 명령어를 통해서 웹 어플리케이션 용도로, 배치 어플리케이션 용도로 실행시킬 수 있다.
배치 어플리케이션은 웹 어플리케이션과 다르게 계속 실행중일 필요가 없다.
주어진 업무(Job)만 완료하면 종료되어도 상관없기 때문이다.
여러 트리거(스케줄러)를 찾아보자.
ex. 매일 9시에 Batch 작업을 실행
2안 모두 3안 대비해서 국내 사례가 적기 때문에 제외되었다.
마지막으로 현업에서도 CI/CD 툴로도 많이 사용하므로, 어떻게든 배워두면 좋겠다는 팀원분들의 의견도 있어서 3안으로 결정하게 되었다.
t2.micro
같은 작은 사이즈의 서버에서 웹/배치 어플리케이션이 동시에 실행될 때, 서버가 힘들어하니 배치 서버를 따로 둬야될 것 같았다..젠킨스 내부에 있는 스케줄러 기능으로 시간을 정해줬다.
여러 방법이 있지만 나는 아래와 같은 명령어를 사용하였다.
java -jar ${JAR_PATH}/app.jar \
--spring.batch.job.name=${JOB_NAME} \
--spring.batch.job.enabled=true
--spring.main.web-application-type=none
먼저 왼쪽은 일반 웹 서비스가 돌아가는 운영 서버 EC2이다.
스프링부트 기반의 웹 애플리케이션이 도커 안에서 동작하고 있고,
사용자 요청을 실시간으로 처리한다.
운영서버와 배치서버를 물리적으로 분리해서 리소스 간섭을 피하고,
배치 작업시 서비스 영향도 최소화할 수 있게 하였다.
배치 서버 안에는 Jenkins가 설치되어 있다.
Jenkins는 지정된 시간마다 트리거 역할을 수행하고,
GitHub에서 main 브랜치를 pull 받아서 최신 배치 jar 파일을 확보한 뒤,
java -jar
명령어를 통해 CLI 방식으로 배치 앱을 실행한다.
(doceker 명령어를 사용해도 됨!)
실제 현업에서는 Git Repository가 private이므로,
S3에 배포된 운영서버 *.jar 파일을 저장해놓으면
Jenkins가 S3에 접근해서 최신 배치 jar파일을 가져오는 형식을 사용한다고 한다.
실행된 스프링 배치 어플리케이션은 도커 내에서 실행되고,
RDS의 MySQL에 접근해 대상 데이터를 조회한 뒤,
메일을 발송하는 작업을 수행한다.
모든 배치 작업이 끝나면 애플리케이션은 종료된다.
실행 이력/ 로그관리를 Jenkins로만 하기엔 부족할 것 같다는 피드백을 받았다.
따라서 두 소프트웨어를 도입해서 프로젝트를 고도화하고자한다.
배치 어플리케이션을 자주 돌리지 않고, 작업(Job)이 많지 않으면 AWS lambda가 어떠냐는 피드백을 받았다. 아무래도 작업 하나에 EC2 하나가 쌩으로 돌아가는 것보다 좋을 것 같다는 생각이다. 추후 적용해보고자 한다.
CI/CD 툴이라고 해서 꼭 배포 작업에만 사용하는 건 아니라는 걸 이번 경험을 통해 깨달았다.
기술을 선택하고 적용하는 과정에서 왜 이걸 써야 하는지,
각 도구가 가진 장점과 단점은 무엇인지 스스로 고민해보게 되었다.
한층 더 시야가 넓어졌고, 앞으로 어떤 기술을 도입할 때도 열린마음을 갖자.
https://theliar.tistory.com/14
https://mjin1220.tistory.com/57
https://jojoldu.tistory.com/489
https://soobindeveloper8.tistory.com/1015
[영상] Jenkins로 배포하기
[영상] Spring Batch 애플리케이션 성능 향상을 위한 주요 팁
[영상] 우아한테크세미나 배치 관리도구로서의 Jenkins
정말 유익하네요 &^^