한글을 모스 부호로 주고받는 웹사이트, 깜빡을 만들며
깜빡은 한글 메시지를 모스 부호로 바꿔 링크로 보내고, 받은 사람이 점과 선을 따라 눌러 풀어 보는 웹사이트예요. 첫 버전은 2026년 10월 5일 새벽에 올라갔고, 그날 여러 번 고치면서 지금의 모습이 됐어요. 만들면서 부딪힌 문제 몇 가지를 기록해 둬요.
한글 부호와 영문 부호가 같은 26개다
한글 모스 부호는 기본 자음 14개와 기본 모음 12개, 모두 26개의 부호를 써요. 그런데 이 26개는 영문 A부터 Z까지의 부호와 하나씩 정확히 겹쳐요. ㄱ은 L과, ㅏ는 E와, ㅓ는 T와 같은 부호예요. 그러니 ·−··만 보고는 ㄱ인지 L인지 알 수 없어요.
깜빡은 한글과 영어를 한 메시지에 섞어 쓸 수 있게 하고 싶었어요. 그래서 일본어 모스 부호가 문자 체계를 바꿀 때 쓰는 전환 신호에서 아이디어를 빌려, 언어가 바뀌는 자리에 전환 부호를 넣기로 했어요. ···−·는 “여기부터 영어”, −··−−−는 “여기부터 한글”이에요. 메시지는 한글로 시작하는 걸 기본으로 하고요.
문제는 다른 곳에서 만든, 전환 부호가 없는 모스 부호예요. 이건 한글로 읽어 보고 자모가 제대로 된 음절로 조립되면 한글, 아니면 영어로 판단해요. 그래도 틀릴 수 있으니, 이 경우에만 붙여넣는 칸 위에 한글/ABC 스위치가 나타나서 직접 고를 수 있어요.
음절을 쪼개고 다시 조립하기
한글 음절은 유니코드에서 규칙적으로 배치돼 있어요. ‘가’(U+AC00)부터 시작해서, 초성 하나마다 588칸, 중성 하나마다 28칸씩 떨어져 있어요. 그래서 음절 코드에서 0xAC00을 빼고 588과 28로 나누면 초성·중성·종성 번호가 나와요. 쌍자음과 겹모음, 겹받침은 다시 기본 자모로 나눠요. ㄲ은 ㄱ ㄱ, ㅘ는 ㅗ ㅏ, ㄶ은 ㄴ ㅎ이에요.
반대 방향이 더 까다로워요. 받은 사람이 자모를 하나씩 맞힐 때마다 글자가 조금씩 완성되는 모습을 보여 주고 싶었거든요. ‘늘’을 푸는 중이라면 ㄴ → 느 → 늘처럼요. 그래서 “지금까지 맞힌 자모 몇 개로 만들 수 있는 가장 그럴듯한 글자”를 계산하는 함수를 따로 두었어요. 이런 부호 처리 코드는 화면과 분리해 두어서, 브라우저 없이 테스트로 검증할 수 있어요.
서버 없이 메시지를 보내는 법
깜빡에는 서버에 저장되는 메시지가 없어요. 메시지는 링크 자체에 담겨요. https://blinker.honeybeecook.com/#k=…에서 #k= 뒤가 메시지를 UTF-8로 바꿔 인코딩한 값이에요. 주소에서 # 뒷부분은 브라우저가 서버로 보내지 않기 때문에, 메시지는 보내는 사람과 받는 사람의 기기에만 있어요.
이렇게 하면 카카오톡 같은 메신저의 링크 미리보기도 걱정할 필요가 없어요. 미리보기를 만드는 봇도 # 뒤는 보지 못하니, 모든 깜빡이 링크의 미리보기는 똑같아요. 메시지가 미리보기에서 들통나지 않는 거죠. 다만 이건 숨긴 것이지 암호화한 것은 아니라서, 링크를 가진 사람은 누구나 풀 수 있다고 안내하고 있어요.
받은 메시지 목록(받은 기록)은 브라우저의 로컬 저장소에 최근 50개까지 남겨요. 계정이 없으니 기기를 바꾸면 사라지지만, 그 대신 가입 없이 링크만 열면 바로 쓸 수 있어요.
누르는 감각과 소리
풀기 화면의 큰 키는 0.22초(220ms)를 기준으로 점과 선을 나눠요. 그보다 짧게 누르면 점, 길게 누르면 선이에요. 숫자만 정해 두면 사람은 언제 손을 떼야 할지 몰라서, 선을 누르는 동안 칸이 게이지처럼 차오르게 했어요. 다 차면 떼면 되고, 점을 너무 오래 누르면 빨갛게 바뀌어요.
소리는 글자마다 낮은 다섯 음(도·레·미·솔·라, 한 옥타브 낮게) 중 하나로 울려요. 그래서 메시지 하나가 짧은 멜로디처럼 들려요. 휴대폰 스피커는 낮은 음을 잘 못 내기 때문에, 기본음에 약한 배음을 섞어서 작은 스피커에서도 들리게 했어요.
정리하면
- 한글 모스 부호는 영문 부호 26개를 그대로 나눠 쓰기 때문에, 섞어 쓰려면 전환 표시가 필요해요.
- 메시지를 링크의
#뒤에 담으면 서버도, 미리보기 노출도 없어져요. - 입력 기준이 시간이라면, 그 시간을 눈으로 보여 주는 게 좋아요.
부호표 전체와 외우는 요령은 한글 모스 부호 가이드에 따로 정리해 두었어요.