728x90
반응형
Spring Boot 2.7.10 + ShedLock으로 배치 이중화 설정하기 (JBoss EAP 7.3 + CUBRID 10.2 + Maven)
이번 프로젝트에서는 JBoss EAP 7.3 환경에서 Spring Boot 애플리케이션을 운영하며, 배치 작업은 스케줄 기반으로 실행되고 있습니다. DB는 CUBRID 10.2를 사용하고, 빌드 툴은 Maven입니다.
JBoss 클러스터링을 통해 세션을 공유할 수는 있었지만, @Scheduled
로 등록된 배치 작업은 각 서버에서 중복 실행되는 문제가 발생했습니다.
이를 해결하기 위해 ShedLock을 도입하여 DB 기반의 분산 락으로 배치 이중화를 구현했습니다.
1. ShedLock이란?
ShedLock은 분산 환경에서 하나의 배치 Job만 실행되도록 보장해주는 경량 분산 락 라이브러리입니다.
팜고 사이트: https://www.baeldung.com/shedlock-spring
2. 프로젝트 환경
- Spring Boot: 2.7.10
- Application Server: JBoss EAP 7.3
- Database: CUBRID 10.2
- Build Tool: Maven
3. Maven 의존성 추가
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>5.6.0</version>
</dependency>
4. CUBRID용 ShedLock 테이블 생성
CREATE TABLE shedlock (
name VARCHAR(64) NOT NULL,
lock_until DATETIME,
locked_at DATETIME,
locked_by VARCHAR(255),
PRIMARY KEY(name)
);
5. 락 설정 클래스
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
/*
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime() // CUBRID 서버 시간 사용이 안되어 제거함.
.build()
);*/
}
}
6. 배치 Job 예시
@Component
public class SampleBatchJob {
@Scheduled(cron = "0 0 * * * *") // 매 정시
@SchedulerLock(name = "SampleBatchJob_run", lockAtLeastFor = "PT1M", lockAtMostFor = "PT5M")
public void run() {
System.out.println("Sample Batch Job 실행됨 - " + LocalDateTime.now());
}
}
7. 동작 방식
- Job 실행 시
name
기준으로 DB에 row 점유 - 다른 인스턴스에서는 해당 시간 동안 Job 실행 차단
- lockAtLeastFor / lockAtMostFor 로 실행 보장 시간 제어
JBoss EAP 7.3 환경에서 Spring Boot 배치를 운영할 경우, 단순한 클러스터링만으로는 스케줄링 충돌을 막기 어렵습니다. ShedLock은 DB 기반으로 정확한 시간 기반 락을 제공하여, 중복 배치 실행을 방지하고 시스템 안정성을 높여줍니다.
특히 CUBRID 10.2에서도 문제없이 연동되며, Maven 프로젝트에서도 설정이 간단해 실무 적용에 매우 적합합니다.
728x90
반응형
'개발 > JAVA' 카테고리의 다른 글
[JAVA/Spring] LoginInterceptor 로그인 인터셉터 (0) | 2021.07.02 |
---|---|
보안점검 조치 패스워드 검증(연속된 숫자/문자, 영문대소문자,특수문자포함 9~20자리 패스워드 검증) (0) | 2021.05.28 |
MyBatis 카멜 자동변환(바로) (0) | 2021.05.17 |
IBatis 카멜 자동변환(바로) (2) | 2021.05.17 |
스네이크 케이스 카멜 케이스로 자동변환(바로) (0) | 2021.05.14 |
댓글