본문 바로가기

개발/Spring

@Scheduled 활용하여 미출퇴근 알림톡 구현

스프링의 @Scheduled를 활용하여 카카오 알림톡으로 미출퇴근 알림을 보내는 기능을 구현했다.

 

출근, 퇴근, 외출, 복귀 알림 기능은 슨배임이 진행하셨고, 기본적인 세팅 또한 맡아서 해주셨다.

 

나는 9시부터 10시까지 15분 간격으로 미출근자에게 출근 권고 알림을 보내는 기능과 17시부터 20시까지 15분 간격으로 미퇴근자에게 퇴근 권고 알림을 보내는 기능을 맡았다.

 

시간 주기는 cron 표현법을 통해 설정했다.

 

초          분          시          일          월          요일          년(생략 가능)
0~59      0~59     0~23      1~31      1~12     0~6

* : 모든 값 (매일, 매주 등)
? : 어떤 값이든 가능
- : 범위 지정 시
, : 여러 값 지정 시

 

@Scheduled(cron = "0 0 9 ? * MON-FRI") => 월요일부터 금요일까지 매일 9시에 스케쥴러가 돈다.

@Scheduled(cron = "0 0/15 17-20 ? * MON-FRI") => 월요일부터 금요일까지 매일 17시부터 20시까지 15분 간격으로 스케쥴러가 돈다.


1. 출근 권고 알림

먼저 오늘 날짜에 출근한 직원들을 리스트로 담아 가져왔다.

 

그 다음에 전체 직원 리스트를 조회하면서 동적 쿼리를 통해 출근 직원 리스트를 NOT IN으로 포함시키지 않도록 처리했다.

 

추가적으로 육아휴직이나 휴가 등의 사유로 인해 출근하지 않는 인원들 또한 조건절을 통해 제외시켰다.

 

이렇게 조회된 인원들을 리스트로 담아 카카오 알림톡을 발송 메소드를 호출하며 매개변수로 전달해줬다.

 

카카오 알림톡 발송 메소드에서는 전달받은 매개변수에 담긴 값들을 하나하나 반복문을 통해 카카오 알림톡 테이블로 INSERT 한다. (카카오 API를 통해 알림톡을 전송해주는 업체가 따로 있어서 양식에 맞게 INSERT 쿼리만 날려주면 됐다.)

 

2. 퇴근 권고 알림

퇴근 권고 알림 대상자를 조회하는 쿼리는 조금 더 복잡했다.

 

조건 자체가 스케쥴러가 작동할 당시에 출근한 지 9시간이 지났지만 아직 퇴근 지문을 찍지 않은 인원들에게 알림톡을 발송하는 것이었다.

 

우선, 출근을 했지만 외근 등의 이유로 퇴근을 안 찍고 퇴근하는 인원들을 조회해야했다. 해당 인원들은 발송 대상에서 제외시켜야 했다.

 

그래서 외근, 출장 등의 이슈를 담고 있는 테이블에서 오늘 날짜에 존재하는 이슈들을 조회해 리스트로 담았다.

 

이후에는 직원들의 출근 시간과 퇴근을 찍었는지 여부, 출근 시간으로부터 9시간이 지났는지 여부 등을 조회해 퇴근 권고 알림 대상자를 추려야 했다.

 

출퇴근 테이블에는 지문을 찍은 시간과 출근, 퇴근 등을 숫자로 구별하는 컬럼만 존재했다.

 

출근 인원 조회 쿼리와 퇴근 인원 조회 쿼리를 사원 번호와 날짜로 엮어서 LEFT JOIN을 했다. (LEFT JOIN을 한 이유는 퇴근을 안 찍은 사람들(퇴근 시간이 NULL인 사람들)의 정보가 나와야 하기 때문이다.)

 

이후, 출퇴근 시간의 최소값을 구해 별칭을 부여했다. (최소값을 구한 이유는 실수로 지문을 두 번씩 찍는 경우가 있기 때문이다. 이럴 경우에는 최초로 등록된 시간을 출퇴근의 시간으로 설정했다.)

 

다음으로 서브쿼리를 통해 미퇴근자들의 출근 시간과 근무 시간(정확하게 하기 위해 현재 시간 - 출근 시간을 초로 계산)을 조회하여 9시간(32,400초)을 초과하는 인원들을 추렸다. mssql을 사용했기 때문에 datediff(), convert(), stuff() 등의 함수들을 사용해 계산했다.

 

이렇게 추려진 인원들 중에 앞서 조회한 이슈가 있는 인원들을 제외한 찐 퇴근 권고 알림 대상자를 추렸다. 이후에는 출근 권고 알림과 동일하게 카카오 알림톡 메소드를 통해 해당 테이블로 INSERT를 해줬다.


입사 후 처음으로 하는 제대로 된 기능 개발이었다. 그래서 어려움도 많았지만 개발을 완료했을 때 뿌듯함도 컸다. 개발 공부를 더욱 열심히 해서 앞으로는 더욱 난이도 있는 개발을 무리없이 할 수 있는 능력있는 개발자로 거듭나야겠다.

 

끝!!