이전 Spring Batch 포스팅에서는 Scheduled 어노테이션을 활용해서 주기적으로 실행하게 만들었었습니다.
관련 글 참고는 아래 포스팅을 확인하시길 바랍니다.
https://hyunily.tistory.com/30
이번 포스팅에서는 계속 Spring Project를 실행시킨 상태가 아닌, 정말 주기적으로 배치 시스템이 실행되고, 데이터를 처리하고, 종료되는 프로세스로 배포를 해보려고 합니다.
Spring Batch 배포 방법에는 독립 실행형 애플리케이션 방식, 스케줄러와 통합 방식, CI/CD 파이프라인과 통합 방식, 애플리케이션 서버에 통합 방식 등 여러 방법이 있습니다.
오늘 다뤄볼 내용은 스케줄러와 통합 방식으로, Ubuntu Server에 직접 Crontab 설정을 진행하고 Spring Batch 프로젝트를 배포해 보겠습니다.
배포하기 앞서 Ubuntu 환경의 서버가 필요합니다.
Ubuntu 설치 과정은 아래 포스팅을 참고하셔서 준비해 주시기 바랍니다.
https://hyunily.tistory.com/25
Spring Batch BootJar 파일 준비하기
Spring Batch 프로젝트 파일을 열고, terminal에서 아래 명령어를 실행합니다.
./gradlew bootJar
기존에 포스팅한 Spring Batch 프로젝트는 Gradle 기반 프로젝트였기 때문에 gradle 명령어를 사용했지만 만약 Maven을 사용해서 프로젝트를 생성하셨다면 아래와 같은 명령어를 사용하시면 됩니다.
./mvnw package
BootJar 파일 경로 확인
위 명령어를 실행하고 나면 아래와 같이 성공했다는 메세지를 확인할 수 있습니다.
만약 성공했다면 프로젝트 패키지 구조에 build라는 새로운 구조가 생성된 걸 확인할 수 있습니다.
build / libs 경로 안에 그럼 bootJar 파일이 생성된 걸 확인하실 수 있습니다.
해당 경로는 추후 Ubuntu Server에 파일을 전송할 때 사용되므로 기억하고 계시면 좋습니다!!
BootJar 파일 Ubuntu Server에 전송하기
Ubuntu Server로 파일을 옮기는 과정은 아래와 같습니다.
1. bootJar 파일 경로 확인
2. Ubuntu Server IP 확인
3. 이동시킬 Ubuntu Server 폴더 경로 확인
4. 파일 이동
물론 상대경로를 사용해서 옮겨도 괜찮지만 절대경로를 사용해서 옮기시는 걸 추천드립니다.
위 과정의 명령어는 아래와 같습니다.
scp /bootjar파일/절대경로/your-boot-jar.jar username@server-ip:/이동시킬/폴더경로
현재 내 로컬 환경에서 bootJar 파일의 절대 경로를 확인 후 입력합니다.
그리고 Ubuntu Server의 username과 IP를 입력하고, bootJar를 위치시킬 경로를 입력하면 됩니다.
예시를 다시 들어드리자면 아래와 같습니다.
scp C:/Users/user/Desktop/Project/Spring-Batch/build/libs/spring_batch-0.0.1-SNAPSHOT.jar test@xxx.xxx.xxx.xxx:/home/batch/
Ubuntu Server에서 파일 확인하기
scp 명령어를 통해 파일을 서버로 옮겼다면 확인하는 절차는 필연적입니다.
ssh를 통해 Ubuntu Server에 접속한 후, 지정한 위치에 가서 실제로 bootJar 파일이 위치하고 있는지 확인합니다.
ssh test@xxx.xxx.xxx.xxx
cd /home/batch/
ls
Crontab 설정
crontab을 설정하기 전, 일단 옮긴 bootJar 파일이 정상적으로 작동하는지 확인이 필요합니다.
아래 명령어를 통해 Spring 프로젝트가 정상 동작하는지 확인합니다.
java -jar /home/batch/spring_batch-0.0.1-SNAPSHOT.jar
만약 정상적으로 실행이 된다면 앞선 포스팅에서 다뤘던 cron 방식을 이제 서버에서 설정하겠습니다.
1. Root 권한으로 Crontab 설정 파일 열기
sudo crontab -e
2. Crontab 내용 작성
nano 편집기를 통해 Crontab 설정 파일을 열면 아래와 같은 내용이 기재된 상태로 파일이 열리게 됩니다.
맨 밑에 아래와 같이 작성합니다.
0 * * * * /usr/bin/java -jar /home/batch/spring_batch-0.0.1-SNAPSHOT.jar >> /home/batch/logs/spring_batch.log 2>&1
명령어의 내용은 아래와 같습니다.
1. 0 * * * * : 매시간 정각에 실행
2. /usr/bin/java : java 실행 파일의 경로 -> which java로 확인 가능
3. /home/batch/spring_batch-0.0.1-SNAPSHOT.jar : 실행할 JAR 파일 경로
4. >> /home/batch/logs/spring_batch.log 2>&1 : 배치 실행 로그를 /home/batch/logs/spring_batch.log에 기록
crontab 내용을 다 작성하셨다면 ctrl + O -> Enter -> ctrl + X를 통해 편집기에서 나옵니다.
Crontab 설정 확인
설정이 완료된 후 정상적으로 작성되었는지 확인하기 위해서는 아래 명령어로 확인할 수 있습니다.
sudo crontab -l
위 과정을 다 따라오셨다면 이제 Ubuntu Server에서 매시간 정각에 작성했던 배치파일이 자동으로 실행되고, 데이터 처리가 완료되면 종료가 되는 배치 서버 구축이 완료됩니다.
물론 스프링 서버를 종료하지 않고 단발성 실행이 아닌 켜놓은 상태에서 @Scheduled 어노테이션으로 데이터를 처리해도 좋습니다.
하지만 배치 작업을 단발성으로 실행하고 필요한 작업이 끝난 뒤 종료하는 방식은 리소스 사용을 최적화하고, 배포 및 유지보수의 유연성을 높이며, 애플리케이션 서버와 배치 서버 간의 명확한 책임 분리를 가능하게 합니다. 이러한 특성은 안정적인 서비스 운영을 위해 꼭 고려해야 할 중요한 요소이기에 단발성 방법을 더 추천드립니다.
'Spring' 카테고리의 다른 글
혼쭐 나기 전, 맛 좀 보자 - Feature Flag (0) | 2024.11.24 |
---|---|
Spring Batch (0) | 2024.09.22 |
Spring Batch - Scheduler (1) | 2024.09.16 |
Spring Batch란? (1) | 2024.09.09 |
Spring Boot 회원가입 - 이메일(SMTP) 인증 구현하기 (0) | 2024.07.28 |