๊ฐ์
์คํ๋ง์์ ์ ๊ณตํ๋ @EnableScheduling ์ด๋ ธํ ์ด์ ์ ๊ฐํธํ๊ฒ ์ค์ผ์ค๋ง ์์ ์ ์ค์ ํ ์ ์๊ฒ ํด ์ฃผ์ง๋ง, ๋ค์ค ์ธ์คํด์ค ํ๊ฒฝ์์๋ ๋์ผํ ์์ ์ด ์ฌ๋ฌ ๋ฒ ์คํ๋ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ShedLock์ด๋ผ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ShedLock์ ์คํ๋ง ์ค์ผ์ค๋ง๊ณผ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๋์ผํ ์ค์ผ์ค๋ง ์์ ์ ๋์์ ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํด ์ค๋๋ค.
ํ ์คํธ ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
ShedLock ์ดํดํ๊ธฐ
ShedLock์ ๋ถ์ฐ๋ ์์คํ ํ๊ฒฝ์์ ๋์ผํ ์ค์ผ์ค๋ง ์์ ์ด ์ค๋ณต์ผ๋ก ์ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ง์ ๋ ์์ ์ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ ์ฉํ์ฌ, ํด๋น ์์ ์ด ์์ ํ ์ข ๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ์ธ์คํด์ค์์๋ ๋์ผํ ์์ ์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค.
ShedLock์ ๋ด๋ถ ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ๊ธ ํ๋: ShedLock์ ๋ฐ์ดํฐ๋ฒ ์ด์ค, Redis, Zookeeper ๋ฑ์ ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ค์ผ์ค๋ง ์์ ์ด ์คํ๋๊ธฐ ์ ์ ShedLock์ ๋จผ์ ์ธ๋ถ ์ ์ฅ์์์ ํด๋น ์์ ์ ์ ๊ธ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ๋ง์ฝ ํด๋น ์์ ์ ๋ํ ์ ๊ธ์ด ์ด๋ฏธ ํ๋๋์ด ์๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์ธ์คํด์ค์์๋ ํด๋น ์์ ์ ์ํํ์ง ์์ต๋๋ค.
- ์ ๊ธ ์ ์ง: ์ค์ผ์ค๋ง ์์ ์ด ์์๋๋ฉด, ์ ๊ธ์ ํ๋ํ ์ธ์คํด์ค๋ ์์ ์ ์ํํฉ๋๋ค. ์ด๋, ShedLock์ ์ ๊ธ์ ์ ์งํ์ฌ ๋ค๋ฅธ ์ธ์คํด์ค์์ ๋์ผํ ์์ ์ ์ค๋ณต์ผ๋ก ์คํํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค. ์ ๊ธ์ ์ธ๋ถ ์ ์ฅ์์ ์ ์ฅ๋๋ฉฐ, ์ผ์ ์๊ฐ ๋์ ์ ์ง๋ฉ๋๋ค.
- ์ ๊ธ ๊ฐฑ์ : ์ค์ผ์ค๋ง ์์ ์ ์คํ ์๊ฐ์ด ์ ๊ธ์ ์ ์ง ์๊ฐ๋ณด๋ค ๊ธธ ๊ฒฝ์ฐ, ShedLock์ ์ ๊ธ์ ๊ฐฑ์ ํ์ฌ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ์ธ์คํด์ค์์ ์์ ์ ์ํํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ ์ ์ค๋ณต ์คํ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ ๊ธ ํด์ : ์ค์ผ์ค๋ง ์์ ์ด ์๋ฃ๋๋ฉด, ShedLock์ ์ ๊ธ์ ์๋์ผ๋ก ํด์ ํฉ๋๋ค. ์ ๊ธ์ ์ธ๋ถ ์ ์ฅ์์์ ์ ๊ฑฐ๋์ด ๋ค์ ์คํ ์ฃผ๊ธฐ์์ ๋ค๋ฅธ ์ธ์คํด์ค๊ฐ ์์ ์ ์ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
ShedLock์ ๋ถ์ฐ๋ ํ๊ฒฝ์์ ์ค์ผ์ค๋ง ์์ ์ ์ค๋ณต ์คํ์ ๋ฐฉ์งํ์ฌ ์์คํ ์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก, ์ฌ๋ฌ ์ธ์คํด์ค ๊ฐ์ ์ ๊ธ ์ ๋ณด๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋์ผํ ์์ ์ด ์ค๋ณต์ผ๋ก ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ์์ ์ ์คํ ์์์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
ShedLock ์ฌ์ฉํ๊ธฐ
ShedLock์ ๋ค์ํ RDBMS, NOSQL, In-Memory DB ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ๋ ์ ์๋๋ฐ, ํ ์คํธ๋ MariaDB๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
์์กด์ฑ ์ถ๊ฐ
Gradle์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
implementation 'net.javacrumbs.shedlock:shedlock-spring:5.10.0'
implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:5.10.0'
lockProvider ์ ์
๋ค์์ผ๋ก Config๋ฅผ ์ค์ ํฉ๋๋ค.
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("scheduled-task-pool-");
scheduler.initialize();
taskRegistrar.setTaskScheduler(scheduler);
}
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build()
);
}
}
์์ ์ฝ๋์์ @EnableSchedulerLock(defaultLockAtMostFor = "PT30S")๋ฅผ ํตํด ShedLock์ ์ค์ผ์ค๋ฌ ์ ๊ธ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ฉฐ, defaultLockAtMostFor๋ ๊ธฐ๋ณธ ์ ๊ธ์ ์ต๋ ์ ์ง ์๊ฐ์ ์ค์ ํฉ๋๋ค.
lockProvider๋ ShedLock์ด ์ ๊ธ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ bean์ ๋๋ค. ์ฌ๊ธฐ์๋ JdbcTemplateLockProvider๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ DataSource๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ์ด๋ฅผ ํตํด ShedLock์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ์ ๊ธ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์ ์ ํ ์ค์ ๋ง๊ณ ๋ JdbcTemplateLockProvider์ ๋ค์ด๊ฐ ์ ์๋ ์ต์ ๋ค์ ์๋์ ๊ฐ์ต๋๋ค.
- withJdbcTemplate(JdbcTemplate jdbcTemplate): JdbcTemplate ๊ฐ์ฒด๋ฅผ ์ค์ .
- usingDbTime(): ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์๊ฐ์ ์ฌ์ฉํ๋๋ก ์ค์ . ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ๊ฐ์ ์๊ฐ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
- withLockId(String lockId): ์ ๊ธ์ ID๋ฅผ ์ค์ . ๋์ผํ ID๋ฅผ ๊ฐ์ง ์ ๊ธ์ ๋์ผํ ๋ ์ฝ๋๋ฅผ ์ฌ์ฉ.
- withColumnNames(ColumnNameProvider columnNames): ์ฌ์ฉํ ํ ์ด๋ธ์ ์ปฌ๋ผ ์ด๋ฆ์ ์ค์ . ColumnNameProvider ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์ฌ์ฉ.
- usingDbTime(ZoneId zone): ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์๊ฐ๋๋ฅผ ์ค์ . ์ด ์ต์ ์ usingDbTime()์ ๊ฐ์ด ์ฌ์ฉ๋์ง๋ง, ํน์ ์๊ฐ๋๋ฅผ ์ค์ ํ ์ ์๋ค.
- withTimeZone(TimeZone timeZone): ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ฐ๋๋ฅผ ์ค์ .
- withTableName(String tableName): ์ ๊ธ์ ์ ์ฅํ ํ ์ด๋ธ ์ด๋ฆ์ ์ค์ .
- withIsolationLevel(IsolationLevel isolationLevel): ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ค์ .
- withTransactionManager(PlatformTransactionManager transactionManager): ํธ๋์ญ์ ๊ด๋ฆฌ์๋ฅผ ์ค์ .
@SchedulerLock ์ค์
@Slf4j
@Component
public class Scheduling {
@Scheduled(cron = "*/5 * * * * *")
@SchedulerLock(name = "scheduled1", lockAtMostFor = "PT2S", lockAtLeastFor = "PT2S")
public void schedule2() {
log.info("Scheduled task executed at {}", LocalDateTime.now());
}
@Scheduled(cron = "*/5 * * * * *")
@SchedulerLock(name = "scheduled2", lockAtMostFor = "PT2S", lockAtLeastFor = "PT2S")
public void schedule2() {
log.info("Scheduled task executed at {}", LocalDateTime.now());
}
@Scheduled(cron = "*/5 * * * * *")
@SchedulerLock(name = "scheduled3", lockAtMostFor = "PT2S", lockAtLeastFor = "PT2S")
public void schedule3() {
log.info("Scheduled task executed at {}", LocalDateTime.now());
}
}
์์ ์ฝ๋๋ @Scheduled์ @SchedulerLock ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ค์ผ์ค๋ง ์์ ์ ์ ์ํ ์์ ์ ๋๋ค. @SchedulerLock ์ด๋ ธํ ์ด์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ๋ค์ด ์์ต๋๋ค.
- name (ํ์): ์ ๊ธ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ ๊ธ์ ๋์ผํ ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ณ ์ ํด์ผ ํฉ๋๋ค.
- lockAtMostFor (ํ์): ์ ๊ธ์ด ์ต๋๋ก ์ ์ง๋๋ ์๊ฐ์ ์ง์ ํฉ๋๋ค. ์ด ์๊ฐ ์ดํ์๋ ์ ๊ธ์ด ์๋์ผ๋ก ํด์ ๋๋ฉฐ, ์ด ์์ฑ์ 'PT30S', '10m', '2h' ๋ฑ์ ISO 8601 ํ์์ ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ์ง์ ํฉ๋๋ค. ์ด ๊ฐ์ ๋ฐ๋์ ์์ ์ ์์ ์ต๋ ์คํ ์๊ฐ๋ณด๋ค ์ปค์ผ ํ๋๋ฐ, ๋ง์ฝ ์์ ์ด ์ด ์๊ฐ์ ์ด๊ณผํ์ฌ ์คํ๋๋ค๋ฉด, ๋ค๋ฅธ ์ธ์คํด์ค์์ ์ ๊ธ์ ํ๋ํ๊ณ ๋์ผํ ์์ ์ ์คํํ ์ ์์ต๋๋ค.
- lockAtLeastFor(์ ํ): ์ ๊ธ์ด ์ต์๋ก ์ ์ง๋๋ ์๊ฐ์ ์ง์ ํฉ๋๋ค. ์ ๊ธ์ด ํ๋๋ ํ, ์ด ์๊ฐ ์ด๋ด์๋ ์ ๊ธ์ด ํด์ ๋์ง ์์ผ๋ฉฐ, ์ด ์์ฑ ๋ํ ISO 8601 ํ์์ ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ์ง์ ํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ ์ค์ ํ๋ฉด, ์์ ์ด ๋น ๋ฅด๊ฒ ์ํ๋ ํ์๋ ์ผ์ ์๊ฐ ๋์์ ๋ค๋ฅธ ์ธ์คํด์ค์์ ๋์ผํ ์์ ์ด ์คํ๋์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
- mode(์ ํ): ์ ๊ธ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 'IMMEDIATE'๋ก, ์ด ๋ชจ๋์์๋ ์ ๊ธ์ ์ฆ์ ํ๋ํ๋ ค๊ณ ์๋ํ๋๋ฐ, ๋ง์ฝ ์ ๊ธ์ ํ๋ํ์ง ๋ชปํ๋ฉด ์์ ์ ์ฆ์ ์คํจํฉ๋๋ค. ๋ค๋ฅธ ์ต์ ์ผ๋ก๋ 'EAGER'๊ฐ ์์ผ๋ฉฐ, ์ด ๋ชจ๋์์๋ ์ ๊ธ์ ํ๋ํ๊ธฐ ์ํด ์ง์ ๋ ์๊ฐ ๋์ ๋๊ธฐํฉ๋๋ค.
ShedLock ํ ์ด๋ธ ์์ฑ
-- MySQL, MariaDB
CREATE TABLE shedlock
(
name VARCHAR(64) NOT NULL,
lock_until TIMESTAMP(3) NOT NULL,
locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name)
);
-- Postgres
CREATE TABLE shedlock
(
name VARCHAR(64) NOT NULL,
lock_until TIMESTAMP NOT NULL,
locked_at TIMESTAMP NOT NULL,
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name)
);
-- Oracle
CREATE TABLE shedlock
(
name VARCHAR(64) NOT NULL,
lock_until TIMESTAMP(3) NOT NULL,
locked_at TIMESTAMP(3) NOT NULL,
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name)
);
-- MS SQL
CREATE TABLE shedlock
(
name VARCHAR(64) NOT NULL,
lock_until datetime2 NOT NULL,
locked_at datetime2 NOT NULL,
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name)
);
-- DB2
CREATE TABLE shedlock
(
name VARCHAR(64) NOT NULL PRIMARY KEY,
lock_until TIMESTAMP NOT NULL,
locked_at TIMESTAMP NOT NULL,
locked_by VARCHAR(255) NOT NULL
);
์ค์ shedlock์ ๋ฐ์ดํฐ๋ ์์ ๊ฐ์ด ์ ์ฅ๋๋๋ฐ, ์ฌ๊ธฐ์ ์ค์ํ ์ฌ์ค์ ShedLock์ ์ค์ผ์ค๋ง ์์ ์ด ์คํ๋ ๋๋ง๋ค ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋, ํด๋น ์์ ์ ์ ๊ธ ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ค๋ ์ ์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ฉฐ, ๋์์ ์ํ๋๋ ์์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.(๋ฐ๋ผ์ ์์ ์ ์คํ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ ค๋ฉด ๋ณ๋๋ก ๋ณ๋์ ๋ก๊น ์์คํ ์ ๊ตฌ์ถํ๊ฑฐ๋, ์ค์ผ์ค๋ง ์์ ๋ด์์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.)
์๋ฌ ํด๊ฒฐ ๊ณผ์
์ฌ๊ธฐ๋ถํฐ๋ ์ ๊ฐ ShedLock์ ์ ์ฉํ๋ฉด์ ๊ฒช์๋ ์๋ฌ์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
1. ์์กด์ฑ ๋ฒ์ ์๋ฌ
ํ๋ก์ ํธ์ JDK ๋ฒ์ ๊ณผ ShedLock ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๋๋ JDK ๋ฒ์ ์ด ์ผ์นํ์ง ์์ ๋ฐ์ํ๋ ์๋ฌ์ ๋๋ค. ์ด ๊ฒฝ์ฐ, ํ๋ก์ ํธ์ JDK ๋ฒ์ ์ ๋ง๋ ShedLock ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, JDK 17 ๋ฒ์ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ShedLock ๋ผ์ด๋ธ๋ฌ๋ฆฌ v4.44.0์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ์ ๋ณด๋ ShedLock์ README์ VERSION ๋ชฉ์ฐจ์์ ํ์ธํ ์ ์์ต๋๋ค.
๊นํ๋ธ๋ฅผ ๋ณด๋ฉด JDK 17 ๋ฒ์ ์ด์ ์ v4.44.0, ์ดํ๋ v5.1.0์ ์จ์ผ ํ๋ค๊ณ ๋ช ์๋์ด ์์ต๋๋ค.
2. shedlock ํ ์ด๋ธ ์ฐพ์ ์ ์์
ERROR 14:15:00 [scheduled-task-1] n.j.s.p.j.JdbcTemplateStorageAccessor, insertRecord at line 73; Unexpected exception
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [INSERT IGNORE INTO shedlock(name, lock_until, locked_at, locked_by) VALUES(?, TIMESTAMPADD(MICROSECOND, ?, UTC_TIMESTAMP(3)), UTC_TIMESTAMP(3), ?)]; SQL state [3D000]; error code [1046]; No database selected; nested exception is java.sql.SQLException: No database selected
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1542)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981)
...
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ shedlock ํ ์ด๋ธ์ ์ฐพ์ง ๋ชปํด ๋ฐ์ํ๋ ์๋ฌ์ ๋๋ค. ์ด ๊ฒฝ์ฐ, DataSource ์ด๊ธฐํ ์์ ์คํค๋ง๋ฅผ ์ง์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, jdbc:mysql://localhost:3306/my_schema์ ๊ฐ์ด ์ง์ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ๋ ๊น๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ShedLock ์ค์ ์์ withTableName๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์คํค๋ง์ ํ ์ด๋ธ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค.(๊ณต์๋ฌธ์์ Configure LockProvider ๋ถ๋ถ์ ์์ธํ ๋์์์ต๋๋ค.)
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withTableName("schema.shedlock")
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build()
);
}
์ ์ค์ ์์ "schema.shedlock"์ {์คํค๋ง}.{ํ ์ด๋ธ๋ช }์ ํํ๋ก ์ง์ ๋์ด ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ํน์ ์คํค๋ง ๋ด์ shedlock ํ ์ด๋ธ์ ์ ํํ ์ฐพ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MySQL ๋ฒ์ ์ ๋ฐ๋ฅธ @Transactional(readOnly=true)์ ๋์ ๊ณผ์ (4) | 2024.01.24 |
---|---|
Hibernate์ @Formula๋ฅผ ์ด์ฉํ ์ฐ๊ด ๊ด๊ณ ์ํฐํฐ ์ง๊ณ (0) | 2023.12.20 |
Bucket4j๋ก ํธ๋ํฝ ์ ํํ๊ธฐ(Redis & MariaDB) (10) | 2023.12.03 |
default method๋ก JpaRepository ์ข ๋ ์ฐ์ํ๊ฒ ์จ๋ณด๊ธฐ (0) | 2023.11.16 |
@Scheduled ์ฌ์ฉํ ๋ ์ค๋ ๋ ์ค์ (0) | 2023.11.09 |
ArchUnit์ผ๋ก ์ํคํ ์ฒ ๊ฒ์ฌํ๊ธฐ (0) | 2023.10.28 |
๋๊ธ