-
Notifications
You must be signed in to change notification settings - Fork 2
스케줄러와 FCM을 통한 목표 알림 기능 제작
Jemlog edited this page Nov 8, 2023
·
5 revisions
![스크린샷 2023-11-03 오후 2 18 13](https://private-user-images.githubusercontent.com/82302520/281311793-a88ccb88-2c91-4e4c-a4d1-faaa55aecd0a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNjk4NDgsIm5iZiI6MTczOTM2OTU0OCwicGF0aCI6Ii84MjMwMjUyMC8yODEzMTE3OTMtYTg4Y2NiODgtMmM5MS00ZTRjLWE0ZDEtZmFhYTU1YWVjZDBhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDE0MTIyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcyMjRkM2Q3MWE5NjBhNzk0MTdlOTQyODE1ZjBjMGM0ZmY5MjUwZjdlYTgyYjZiMTA2MzIxNWQ2N2FlYjA1NDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.GoW9CB8f70s0DgiAI7Xugg2xgSqrjPLKtibbC2sc2zk)
마일스톤에는 사용자가 선택한 요일과 시간에 리마인드 알림을 보내주는 기능이 있습니다.
비즈니스 규칙
- 요일은 복수 선택이 가능하다.
- 시간 설정은 30분 단위로 가능하다. (ex. 7:00 -> 7:30 -> 8:00)
- 사용자는 알림을 받을지 여부를 직접 선택 가능하다.
알림의 기준이 되는 목표 테이블과 요일을 저장하는 테이블
![스크린샷 2023-11-08 오후 5 27 10](https://private-user-images.githubusercontent.com/82302520/281319626-0db20c50-455d-48b4-b3ae-23c8e7845db7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzNjk4NDgsIm5iZiI6MTczOTM2OTU0OCwicGF0aCI6Ii84MjMwMjUyMC8yODEzMTk2MjYtMGRiMjBjNTAtNDU1ZC00OGI0LWIzYWUtMjNjOGU3ODQ1ZGI3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDE0MTIyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJiYTk3NzFmMGFhN2UxZWU0NzQ2NzQ0MDExYTg4MjA1ZmY3MWUwZjcxOWM0YWQwNTY5NzdjMTg1YThkMWM1OWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.QE02IUB09EXcBAwroFS_HS5D_lWmGQyDfxb0-Rh2gE4)
조회에 사용되는 컬럼
- alarm_enabled : 알람을 보낼지 여부를 결정합니다.
- alarm_time : 알람을 보내는 시간을 결정합니다.
- detail_goal_alarm_days.alarm_days : 알람을 보내는 요일을 결정합니다.
알림을 전송해야 하는 목표 리스트를 조회하는 쿼리
public List<DetailGoalAlarmResponse> getMemberIdListDetailGoalAlarmTimeArrived(DayOfWeek dayOfWeek, LocalTime alarmTime)
{
return query.select(detailGoal)
.from(detailGoal)
.where(
...
detailGoal.alarmEnabled.isTrue(), // 알람을 허용한 하위 댓글 조회
detailGoal.alarmDays.contains(dayOfWeek), // 알람을 보내기로한 요일들에 현재 요일이 포함되는지 체크
detailGoal.alarmTime.between(alarmTime.minusMinutes(1),alarmTime.plusMinutes(1)) // 미세한 시간차를 고려해서 앞뒤로 1분까지 범위에 포함
)
.fetch();
}
}
스케줄러 구현 코드
@Scheduled(cron = "0 */30 * * * *", zone = "Asia/Seoul") // 30분 단위로 스케줄러가 동작합니다.
public void sendAlarm()
{
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek(); // 오늘이 어떤 요일인지 알아옵니다.
LocalTime localTime = LocalTime.now(); // 현재 시간을 구합니다.
LocalTime now = LocalTime.of(localTime.getHour(), localTime.getMinute(), 0);
// 현재 요일과 시간에 해당하는 목표 리스트를 구해옵니다.
List<DetailGoalAlarmResponse> detailGoalAlarmList = detailGoalQueryRepository.getMemberIdListDetailGoalAlarmTimeArrived(dayOfWeek, now);
// 조회한 목표의 사용자들에게 순차적으로 알림을 전송합니다.
detailGoalAlarmList.forEach(alarmDto ->
applicationEventPublisher.publishEvent(new AlarmEvent(alarmDto.uid(), alarmDto.detailGoalTitle())));
}
DB에서 조회한 정보를 기반으로 유저들에게 FCM 푸시 알림을 전송합니다.