모든 프로젝트

앱, 건강 도구, 오프라인 PWA

Shift Sleep Planner

  • 자동 테스트 64개
  • 의학적 조언 아님

야간·교대 근무자를 위한 한국어 모바일 웹앱입니다. 근무, 잘 수 없는 시간, 실제로 잔 시간을 입력하면 그에 맞춰 오늘과 내일의 수면을 계획합니다. 홈 화면에 설치할 수 있고 오프라인에서도 작동합니다.

라이브 데모 열기(가상의 야간 근무 일정, AI 요약은 고정 예시) ↗GitHub 코드: hyh4867/shift-sleep-planner ↗

가상의 22:00–06:00 야간 근무의 오늘 화면: 타임라인, 근무 중에 걸려 표시된 00:30 카페인 마감, 출처 태그가 붙은 조명 줄이기 안내.
야간 근무 · 근무 중에 걸린 카페인 마감을 표시
주간 화면: 날짜별 수면 막대(기록 없는 날은 빗금)와, 기록한 날만으로 계산한 누적 부족 3시간 30분.
주간 · 부족은 기록한 날만 계산
가상의 혼합 교대 일정의 오늘 화면: 교육 일정 때문에 줄어든 주 수면과 다음 야간 근무 전 90분 낮잠.
혼합 교대 · 교육 일정을 피한 수면
AI 요약 미리보기: 기록한 날의 일별 합계, 낮잠 횟수, 부족량, 기록 없는 날 수처럼 실제로 보낼 내용을 그대로 보여 줍니다.
AI 미리보기 · 보내기 전에 집계값을 보여 줌

질문

야간·교대 근무를 하면 수면은 남는 틈으로 밀려납니다. 공개된 수면 지침을 한 사람의 근무표에 맞춘 구체적인 시각으로 바꾸고, 규칙마다 출처를 보여 주면서, 일정이 폰 밖으로 나가지 않게 할 수 있을까요?

만든 것

순수 함수로 된 플래너가 가장 긴 빈 시간에 주 수면을 넣고(야간 근무 뒤에는 30분 쉬는 시간 다음의 첫 빈 시간), 야간 근무 전에 낮잠을 더하고, 하루 목표까지 채운 뒤, 주 수면마다 카페인 마감과 조명 줄이기 시간을 계산합니다. 모든 기본값은 설정에서 바꿀 수 있습니다.

근무, 불가능한 시간, 실제 수면 블록은 자정을 넘길 수 있고, 겹치는 블록은 저장하기 전에 거부합니다. 오늘/내일 타임라인과 주간 차트로 계획을 보여 주며, 모든 권고에 출처 태그가 붙습니다.

선택형으로, Claude(claude-haiku-5-5)가 쓴 한 단락짜리 주간 요약을 Vercel 서버리스 함수로 받을 수 있습니다. 기본은 꺼져 있고, 켤 때 동의를 받습니다. 요청할 때마다 실제로 보낼 JSON을 그대로 보여 줍니다. 호출 횟수는 기기별, IP별, 하루 전체로 제한합니다. 라이브 데모에는 API 키가 없으므로, 요약은 “데모 예시”라고 표시한 고정 문장이며 보낸 데이터를 분석하지 않습니다.

규칙과 출처

표시한 값은 기본값이며 앱에서 바꿀 수 있습니다. “앱 정의”로 표시한 부분은 출처의 주장이 아니라 제가 정한 운영 기준입니다.
규칙기본값출처
수면 목표하루 7시간 이상(주 수면과 낮잠 합산). 수면은 끝나는 날에 포함AASM–SRS 공동 합의(Watson et al., 2015). 24시간 합계로 적용한 것은 앱 정의
야간 근무 전 낮잠근무 전 빈 시간 2시간 이상 → 90분, 45분 이상 → 20분. 낮잠은 근무 30분 전에 끝남NIOSH 2015-115, Module 7(“Before Nights”, “Nap Duration”). 야간 근무 = 00:00–06:00과 겹치는 근무(앱 정의)
주 수면평소 취침 시각의 가장 긴 빈 시간. 야간 근무 뒤에는 30분 쉬는 시간 다음의 첫 빈 시간. 근무 전 기상 여유 30분앱 정의
카페인 마감계획한 주 수면 6시간 전. 카페인은 근무 초반에. 마감이 근무 중에 걸리면 표시Drake et al., J Clin Sleep Med 2013; NIOSH Module 6
조명 줄이기주 수면 1–2시간 전NIOSH Module 6
누적 부족기록한 날마다 목표에 못 미친 양의 합. 초과분은 상쇄하지 않음. 기록 없는 날은 계획 추정치로 따로 표시앱 정의

개인정보 설계

근무와 수면 시각은 폰 브라우저의 IndexedDB에만 저장됩니다. 계정도 서버 사본도 없으며, 백업은 사용자가 내보내고 가져오는 JSON 파일입니다.

AI 요약이 받는 것은 집계값뿐입니다. 사용자가 실제로 기록한 날의 총 수면 분과 낮잠 횟수(날짜 대신 1–7 번호), 그 기간의 부족량, 목표, 기록 없는 날 수입니다. 날짜, 시각, 메모, 계획 추정치는 보내지 않습니다.

브라우저와 서버가 같은 검증기를 씁니다. 정해진 키와 범위 안의 값만 허용하고, 합계가 일별 값과 맞아야 하며, 시각이나 날짜처럼 보이는 값은 거부합니다. API 키는 서버 환경 변수에 둡니다. 공개 배포에 API 키나 호출 제한 저장소가 없으면 함수는 모델을 호출하지 않고 데모 예시로 표시한 고정 요약을 돌려줍니다. 라이브 데모가 이 방식으로 돌아갑니다.

평가 방법

Vitest 테스트 64개가 다음을 확인합니다. 자정을 넘는 근무, 겹침 거부, 낮잠 배치와 30분 여유, 카페인 마감 계산, 24시간 합계와 부족 누적(화면의 “초과분은 상쇄하지 않음” 규칙 포함), 표본 주의 AI 전송 데이터에 시각·날짜·메모가 없는지, 서버 호출 제한과 데모 모드, 서버리스 함수의 import 경로.

AI 요약 핸들러는 가짜 모델로만 시험했습니다. 실제 API 키로 돌려 본 적이 없으므로 실제 요약의 품질은 검증하지 않았습니다.

가상의 일정 세 가지(주간 근무만, 연속 야간 근무, 혼합 교대)로 겹침을 검사하고, 모든 스크린샷에도 썼습니다. 운영 배포에서 올바른 데이터는 데모 표시가 붙은 예시 요약을 받고, 시각이 들어간 데이터는 HTTP 400으로 거부됩니다.

주요 결과

가상의 22:00–06:00 야간 근무에서 계획은 이렇습니다. 주 수면 06:30–13:30, 다음 근무 전 20:00–21:30의 90분 낮잠, 카페인 마감 00:30. 마감이 근무 한가운데에 걸리므로 앱이 이를 표시합니다.

가상의 야간 근무 주에서 기록한 날 기준 부족은 3시간 30분입니다. 연속 야간 근무 전 짧게 잔 밤의 30분, 야간 근무 뒤 처음 두 번의 낮 수면에서 2시간과 1시간입니다. 9시간을 잔 날이 있어도 이 부족은 상쇄되지 않습니다.

규칙을 글로 적다 보니 제 기획의 모순이 드러났습니다. 근무 30분 전에 끝나야 하는 20분 낮잠은 45–49분짜리 빈 시간에 들어갈 수 없습니다. 앱은 여유 시간을 지키고 낮잠을 건너뛰며 그 이유를 알려 줍니다.

첫 배포에서 로컬 테스트가 놓친 버그를 찾았습니다. Node의 네이티브 ES 모듈은 파일 확장자를 명시해야 해서, 서버리스 함수가 ERR_MODULE_NOT_FOUND로 실패했습니다. 이제 테스트가 함수의 import 그래프를 따라가며 확인합니다.

제 역할과 에이전트 활용

기획을 맡았습니다. 적용할 규칙과 출처, 개인정보 제약, AI가 받아도 되는 정보, 검토 뒤 반영한 변경(기록한 날만 계산하는 부족, 쉬는 시간 여유, 호출 상한)을 정했습니다.

Claude가 앱, 테스트, 배포를 범위가 정해진 단계로 구현했습니다. 결과물을 검토했고 이 페이지의 주장은 제가 책임집니다.

한계

의학적 조언이 아닙니다. 앱은 아무것도 진단하지 않으며, 불면이나 심한 졸림이 이어지면 의료 상담을 받으라고 안내합니다.

앱이 수면, 각성, 안전을 개선하는지는 시험하지 않았습니다. 테스트는 규칙이 적힌 대로 적용된다는 것을 보여 줄 뿐, 규칙이 도움이 된다는 것을 보여 주지 않습니다.

규칙은 인용한 지침을 단순화해 읽은 것입니다. 24시간 합계, 쉬는 시간과 기상 여유, 배치 경험칙은 제가 정한 것이며 앱에도 그렇게 표시했습니다.

코드, 테스트, 데모, 스크린샷의 모든 일정은 가상입니다. 실제 근무표는 쓰지 않았습니다.

라이브 데모의 AI 요약은 분석이 아닌 고정 예시 문장이며, 요약 핸들러는 가짜 모델로만 시험했습니다. 실제 요약은 틀릴 수 있습니다. 이 기능은 선택 사항이고, 앱은 이것 없이도 모두 작동합니다.

근거와 재현성

소스 코드와, 모든 규칙·기본값·앱 정의 선택을 정리한 README가 공개되어 있습니다. 모든 스크린샷은 내장된 가상 데모 일정으로 찍었습니다.

Watson et al., Recommended Amount of Sleep for a Healthy Adult (AASM–SRS, 2015) ↗

NIOSH, Training for Nurses on Shift Work and Long Work Hours (Pub. 2015-115) ↗

Drake et al., Caffeine effects on sleep taken 0, 3, or 6 hours before going to bed (2013) ↗

모든 프로젝트로 돌아가기