Skip to content

Latest commit

 

History

History
45 lines (30 loc) · 4.09 KB

use-taskschedule.md

File metadata and controls

45 lines (30 loc) · 4.09 KB

동적 스케쥴링 도전하기

여기서 생각보다 너무많은 시간을 썼다. 그리고 그냥 너무 생각이 많았다. 단순하게 생각하면 됐을걸 일단 구현해보고 수정해나가던지 더 좋은 방법으로 교체하던지 했으면 됐는데 시작부터 고민을 많이했다.

내가 동적 스케쥴링을 사용하게 된 계기는 '투표가 종료시간이 되면 종료되어야 한다.'라는 기능을 구현하기 위해서 였다. 그냥 진짜 간단하게 구현하려면 종료시간이 되면 바꾸는거? 그냥 스케쥴링 짧게 걸어서 하면되지라고 생각했다. 근데 이 방법은 싫었다. 모든 요구사항을 맞추기 위해서는 cron 을 짧게 가져가서 시간에 맞춰서 종료하게 해야하는데 이러면 만약 투표종료시간이 아닐때도 계속 스케쥴러가 돌고있을 것 아닌가. 비효율의 극치라고 생각했다. 그래서 나는 여기저기 물어보기도 하면서 검색도 하고 알아낸 방법은 동적 스케쥴링이었다.

동적 스케쥴링을 사용하면 종료시간에 스케쥴러가 동작하게 하여서 투표 마감시간이 되면 종료하는 메서드를 실행 시킬 수 있다고 했다.

그래서 동적 스케쥴링을 사용하기로 했고 먼저 스프링에서 제공해주는 TaskScheduler를 사용하기로 했다. 사용하기로 한 이유는 생각보다 사용하는게 어렵지는 않아보였다. 그냥 스케쥴을 넣어주면 동작하는 것으로 보였다. 파고들면 상세한 구현부는 어렵겠지만 일단 내가 가져다 쓸수는 있을 것으로 보였다.

Instant 타입이 뭐야?

처음에 메서드를 쓰려고 했을 때 처음 보는 타입을 넣으라고 했다. Instant? 이게 도대체 뭔지 몰랐다. 그래서 나는 그냥 종료시간을 뭐 Instant타입으로 감싸면 되지 라고 생각하고 그냥 뇌를 빼고 대충 메서드체이닝으로 넣어서 해봤다. 그런데 내가 생각한대로 동작하지 않았다. 코드는 아래와 같다.

private void addVoteTaskToTaskSchedule(Vote vote) {
        taskScheduler.schedule(publishClosedVoteTask(vote.getVoteId()), vote.getEndAt().toInstant(ZoneOffset.UTC));
    }

toInstant가 뭔가 그냥 형변환을 해줄 것 같았다. 그리고 다시 파라미터로 뭘 넣어야되나 봤더니 ZoneOffSet을 넣으라고 되어있었다. 그냥 어디서 들어본 UTC를 넣었더니 또 감사하게도 인텔리제이에서 자동완성을 통해서 이렇게 코드를 만들어주셨다.

아무것도 모르고 코딩하니까 될리가 없다.

UTC란? 영국을 기준(UTC+0:00)으로 각 지역의 시차를 규정한 것이다. 한국은 영국보다 9시간 빠르므로UTC+9:00이라고 표시한다.

그러니까 내가 해준대로 하면 영국시간 기준으로니까 종료시간+9시간 뒤에 스케쥴이 실행된다. ㅋㅋㅋㅋ 이러니까 될리가 있나

하여튼 그래서 Instant Type이 뭐였을까

Instant는 자바 1.8 java.time package에 들어가있으며 UTC의 타임 라인에있는 순간으로, 1970년 1월 1일 UTC의 첫 번째 순간 이후의 현재 시간까지의 나노초를 나타낸 값 입니다. 부분의 비즈니스 로직, 데이터 저장 및 데이터 변경은 UTC로 이루어져야하므로 자주 사용하기에 편리한 클래스입니다.

출처: Java8+ Instant vs LocalDateTime 각 사용방법

그러니까 LocalDateTime은 지역정보와 같은 곳이 없기 때문에 시차를 고려할 수 없다? 와 같은 내용인 것 같다. 그냥 LocalDateTime을 생각없이 써왔는데 이러한 문제도 존재하는구나.. 라고 생각하게 되었다.

public Instant getInstantEndAt() {
    return endAt.atZone(ZoneId.systemDefault()).toInstant();
}

이렇게 리팩토링 해서 지금 돌아가고 있는 시스템의 시각으로 Instant객체로 반환하도록 수정하여서 하니 스케쥴러가 내가 원하는 시간에 잘 동작하였다.