/var/www/tistory/Yongbaldae
yongmin@kali: ~/blog$ ls posts

[Spring] @EnableScheduling으로 주기함수 만들기

Spring 프로젝트를 진행중에 아래와 상황을 마주했다.

 

"00시부터 6시간을 주기로 외부 API호출로 DB를 채워야한다."

기존에 작성해두었던 코드로 API 호출은 어렵지 않았으나 저 6시간 주기라는 것에서 생각에 잠겼다.

 

선택사항은 두 가지였다.

 

1. 자바(Spring) 내부에서 @Scheduled로 돌리는 방법

  • @EnableScheduling + @Scheduled(cron = "...")
  • 앱이 켜져 있는 동안 스스로 6시간마다 돈다.

2. 우분투 cron으로 curl/스크립트 호출

  • 리눅스 crontab에 특정 시간마다 curl http://.../sync 같은 엔드포인트를 때리거나 자바 실행 스크립트를 돌리는 식.
  • 인프라를 좀 더 세밀하게 쪼개고 싶을 때 쓰는 방식.

 

이미 서버에서 나름(?) 제대로 동작중인 앱을 대책없이 바꿀 수 는 없었거니와,

실제로 6시간마다 호출하면 DB에 Raw가 어느정도씩 쌓이게되는지 감이 안와서 테스트를 해보았다.

 

@SpringBootApplication
@EnableConfigurationProperties(MainApiProperties.class)
@EnableScheduling //스케쥴링 어노테이션
public class MainApplication {

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

}

어플리케이션에는 상단과 같이 @EnableScheduling 어노테이션을 달아버린다.

@Slf4j
@Service
@RequiredArgsConstructor
public class SyncService {

// ... 내용 생략

    @Scheduled(cron = "*/10 * * * * *") // 테스트용으로 10초 주기
    @Transactional
    public void syncLatestScheduled() {
        log.info("[Sync] scheduled job triggered");
        syncLatestOnce();
    }
}

그리고 service layer에서 특정 함수를 @Scheduled 어노테이션을 달아버리고 cron 으로 값을 설정한다.

각 항목은 초 분 시 일 월 요일 을 뜻하며 이 함수는 테스트 용이기 때문에 10초 주기로 동작하게 하였다.

원래 6시간 주기라고 한다면 , 이렇게 설정해야 한다.

@Scheduled(cron = "0 0 */6 * * *") 

 

만약 24시간동안 4번을 돈다면 총 몇개의 행이 생길지를 가늠하기 위해서 함수를 돌리면서 로그를 찍어봤더니 아래와 같다.

하루동안 발생한 건

더 비교해봐야겠지만 , 한 일주일치만 확인해본바로는 각 날마다 4000건을 넘지는 않는 것으로 파악되었다.

 

혹시나 만건이 넘어가버려서 6시간 주기로 돌렸다가 서버가 행걸리는건 아닌가 싶었는데 ,,, 그럴 걱정은 안해도 될 것 같다.

 

 

 

P.S. 내가 인프라에 대해서 좀 더 공부해보고 , 저렇게 주기별로 긁어와서 DB에 넣는 역할을 하는 앱은 서버에서 구동되고 있는 앱과 분리를 하는게 더 나은 것인지 , 아니면 다른 방도가 있는 것인지를 찾아봐야할 것 같다.

 

 

more_posts (recent 5)