Skip to content

알림 수신 시간대 설정해보기 ​

실무에서 알림 메시지를 어떤 요일·어떤 시간대에 수신할지 사용자가 직접 설정해야 한다는 요구사항이 있었어요. "평일 업무 시간대에만 알림을 받을게요" 같은 설정이죠. 단순해 보이지만 막상 구현하려고 보면 결정해야 할 사항들이 생각보다 많았어요.

이 글은 요구사항을 해결하면서 알게 된 정보들을 정리해 공유 해보려고 해요. 다루고자 하는 내용은 다음과 같아요.

  • 사용자가 선택한 요일을 어떻게 관리할까?
  • 주의 시작은 어떻게 정해야 할까?
  • DayOfWeek 의 표준은 무엇인가?

1. 사용자가 선택한 요일을 어떻게 관리할까? ​

당연하게도 설계와 구현은 AI 에이전트에게 맡겼는데 사용자가 선택한 요일을 dayOfWeekMask 라는 필드를 두고 관리하더라고요. 저는 Boolean 배열을 사용해야 하지 않을까 생각했는데 비트마스크로 구현했더라고요. 그러면, 왜 비트마스크를 사용할까요?

비트마스크로 구현하면 매일과 평일 그리고 주말에 대한 표현을 비트 연산으로 빠르고 쉽게 판단할 수 있어요. 물론 비트로 관리하는 게 인간에게 코드 가독성을 주진 않아요.

2. 주의 시작은 어떻게 정해야 할까? ​

AI 에이전트는 저에게 주의 시작(weekStart)에 대해서 결정을 요구했어요. 그래서 찾아보니 ISO 8601 표준은 월요일을 시작으로 하는데 달력처럼 일부에서는 일요일을 시작으로 하는 걸 볼 수 있어요.

대한민국도 한 주의 시작은 월요일이지만 달력만큼은 일요일 시작으로 유지하고 있어요.

그래서 기술적인 표준과 다르게 일반적인 사용자는 달력 순서에 익숙하다는 생각으로 weekStart를 0으로 두고 나중을 위한 유연한 설계로 남기기로 했어요.

3. DayOfWeek 의 표준은 무엇인가? ​

하나의 웹 시스템을 구성하는 프론트엔드, 백엔드 그리고 데이터베이스 사이에도 표준은 갈렸어요. PostgreSQL 은 ISO 8601 표준에 따라 월요일을 주의 시작으로 하는 isodow 를 지원하지만 기본값은 일요일을 0으로 하는 dow 를 사용해요.

다만, 자바의 DayOfWeek 은 월요일(1)부터 시작하기 때문에 서비스 로직에서 무언가를 판단할 때에는 기준을 맞추는 게 중요해져요. 실무 프론트엔드에서 사용중인 Day.js 는 기본적으로는 일요일(0) 시작이지만 isoWeekday() 메서드를 통해 월요일(1)을 기준으로 할 수 있도록 지원해요.

사용자가 보게될 결과물 ​

알림 수신 시간대 설정 UI 목업 — 요일 토글과 시작/종료 시각 입력

사용자가 보게 될 결과물은 dayOfWeekMask 와 startTime/endTime 두 시각 필드, 그리고 weekStart 가 결합된 토글 UI 로 단순합니다. 이 단순함을 유지하기 위해 어떤 결정들이 오갔는지는 사용자 화면 너머에 남아요.

참고 자료 ​

Released under the MIT License.