비몽사몽 새벽을 위한 배려: 야간 모드와 부드러운 웹 알람 구현기 (디테일 및 배포)

1. 찢어지는 사이렌 소리는 안 돼! 부드러운 Web Audio API 도입

타이머 로직을 완성하고 테스트를 해보니 큰 문제가 하나 있었습니다. 알람이 울릴 때 폰에서 나는 시끄러운 경고음이 오히려 힘들게 잠든 아이를 깨워버리는 대참사를 일으킨 것입니다. 게다가 외부 mp3 파일을 불러와서 소리를 내면, 네트워크가 불안정할 때 소리가 나지 않는 치명적인 에러가 발생할 수 있습니다.

그래서 저는 브라우저에 내장된 ‘주파수 발생기’인 Web Audio API를 사용하여, 별도의 오디오 파일 없이도 호텔의 차임벨이나 부드러운 오르골 같은 맑은 ‘딩~ 동~’ 소리를 코드로 직접 합성해 냈습니다.

JavaScript

function playGentleChime() {
    audioContext = new (window.AudioContext || window.webkitAudioContext)();

    function triggerBell() {
        const osc = audioContext.createOscillator();
        const gainNode = audioContext.createGain();
        
        osc.type = 'sine'; // 부드러운 곡선 파형(사인파) 사용
        osc.connect(gainNode);
        gainNode.connect(audioContext.destination);
        
        const now = audioContext.currentTime;
        
        // 맑은 차임벨 소리 주파수 세팅 (미-솔)
        osc.frequency.setValueAtTime(659.25, now); 
        osc.frequency.setValueAtTime(783.99, now + 0.4); 
        
        // 소리가 서서히 커졌다가 부드럽게 사라지도록 볼륨(Envelope) 조절
        gainNode.gain.setValueAtTime(0, now);
        gainNode.gain.linearRampToValueAtTime(0.3, now + 0.05);
        gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.4);
        
        osc.start(now);
        osc.stop(now + 1.2);
    }
    
    triggerBell();
    window.chimeInterval = setInterval(triggerBell, 2000); // 2초마다 반복
}

이 코드는 단순히 시끄러운 소리를 내는 것이 아니라, sine 파형을 이용해 부드러운 울림을 만들고 소리의 감쇠(exponentialRampToValueAtTime)를 조절하여 아이가 놀라지 않도록 부모에게만 부드럽게 알람을 전달합니다.

2. 눈부심 방지를 위한 다크 모드와 직관적인 오버레이 팝업

새벽 2시에 어두운 방 안에서 스마트폰 화면이 갑자기 하얗게 켜지면 눈이 매우 부십니다. 이를 해결하기 위해 우측 상단에 🌙/☀️ 버튼을 추가하여 배경을 부드러운 다크 그레이 톤으로 바꿔주는 ‘야간 모드(Dark Mode)’를 구현했습니다.

더불어 알람이 울리면, 비몽사몽 한 상태에서도 텍스트를 읽을 필요 없이 상황을 인지할 수 있도록 화면 전체를 살짝 어둡게 덮으면서 커다란 알약 이모지(💊)가 두근거리며 튀어나오는 팝업(오버레이) 애니메이션을 추가했습니다.

CSS

/* 야간 모드 전환 CSS 변수 활용 */
body.dark-mode {
    --bg-color: #121212;
    --card-bg: #1E1E1E;
    --text-main: #E0E0E0;
    --text-sub: #9E9E9E;
    --input-bg: #2C2C2C;
}

/* 두근거리는 알약 애니메이션 */
@keyframes pulseEmoji { 
    0% { transform: scale(1) rotate(0deg); } 
    50% { transform: scale(1.15) rotate(-10deg); } 
    100% { transform: scale(1) rotate(0deg); } 
}
.alarm-emoji {
    animation: pulseEmoji 1.5s infinite;
}

자바스크립트의 localStorage를 활용하여 한 번 다크 모드를 설정해 두면, 다음 날 다시 웹사이트에 접속해도 브라우저가 다크 모드 상태를 기억하여 유지하도록 디테일을 살렸습니다.

여기에 초보 부모님들이 실수하지 않도록, 처음 접속 시 “반드시 알람 사운드 테스트를 먼저 진행하세요”라는 가이드라인을 강제하는 ‘온보딩 팝업’까지 추가하며 웹 도구의 완성도를 끌어올렸습니다.

3. 글을 마치며: 개발과 기획의 본질은 ‘문제 해결’

현장에서 시스템을 세팅하고 문제를 해결하던 저의 PM으로서의 경험이, 육아라는 완전히 새로운 영역에서 이렇게 쓰일 줄은 몰랐습니다. 아이가 아파서 뜬눈으로 밤을 지새워야 했던 초보 아빠의 절박함, 그리고 의사와 약사의 난해한 설명을 직관적으로 풀어내기 위해 참고했던 유유제약의 훌륭한 가이드라인이 만나 ‘새벽반 열내림 특공대’라는 작은 결과물이 탄생했습니다.

이 코드는 HTML 파일 하나로 이루어진 매우 가벼운 프로그램이라, 제가 운영하는 워드프레스 블로그의 ‘사용자 정의 HTML’ 블록에 복사해서 붙여넣기만 하면 즉시 전 세계 어디서든 모바일로 접속해 사용할 수 있습니다.

혹시라도 저처럼 새벽에 아이의 열 때문에 애태우며 핸드폰 계산기를 두드리고 계실 누군가에게, 이 작은 웹 유틸리티가 조금이나마 든든한 위안과 도움이 되기를 진심으로 바랍니다.

[🚒새벽반 열내림 특공대 링크]

댓글 남기기