
개발자라면 하루 중 가장 많이 보는 색깔이 무엇일까요?
아마 #000000, 검은색일 겁니다.
IDE 테마도 다크 모드, 터미널도 검은 바탕에 흰 글씨죠.
하루 종일 모니터 속 까만 화면만 들여다보고 있으면 가끔 숨이 턱 막힐 때가 있습니다.
저도 10년 차가 넘어가니 코드가 낭만보다는 생존 수단처럼 느껴질 때가 많거든요.
그런데 오늘, 삭막한 제 터미널 창에 낭만적인 '달' 하나를 띄우게 되었습니다.
우연히 발견한 'The ASCII Side of the Moon'이라는 프로젝트 덕분입니다.
이 프로젝트는 아주 단순하지만, 동시에 굉장히 기술적이고 집요합니다.
사용법은 개발자에게 가장 익숙한 도구인 curl 명령어 한 줄이면 충분합니다.
터미널을 열고 특정 URL로 요청을 보내면, 그 즉시 화면에 7-bit ASCII 아트로 렌더링 된 달이 뜹니다.

단순히 그림 한 장을 불러오는 게 아닙니다.
여러분이 명령어를 입력한 바로 그 순간, 그 시간의 달을 계산해서 보여줍니다.
이게 무슨 말이냐고요?
지구와 달 사이의 거리는 일정하지 않습니다.
달이 지구에 가까워지는 근지점과 멀어지는 원지점에 따라 크기가 달라지죠.
이 프로젝트는 그 거리 차이로 인한 겉보기 크기(Apparent Size)를 최대 12%까지 반영해 ASCII로 표현합니다.
심지어 '월면 리브레이션(Libration)'까지 구현되어 있습니다.
달은 궤도를 돌 때 미세하게 위아래, 좌우로 흔들립니다.
우리가 지구에서 달의 뒷면을 영원히 볼 수는 없지만, 흔들림 덕분에 앞면의 가장자리는 조금씩 다르게 보이죠.
이 미세한 각도까지 계산해서 텍스트로 찍어내는 겁니다.
서울에서 보는 달과 뉴욕에서 보는 달의 각도가 다른 것, 알고 계셨나요?
lat(위도)와 lon(경도) 파라미터를 넘기면, 여러분이 서 있는 그 위치에서 보이는 정확한 달의 기울기를 보여줍니다.
저는 처음에 그냥 "재밌는 장난감이네" 하고 넘기려다, 구현 방식을 보고 자세를 고쳐 앉았습니다.
이건 장난이 아니라 '최적화의 예술'에 가깝습니다.
이 서비스는 Cloudflare Pages의 무료 플랜 위에서 돌아갑니다.
무료 플랜의 제약 사항은 꽤 가혹합니다.
자바스크립트 번들 크기는 3MB 미만이어야 하고, CPU 처리 시간은 10ms(밀리초) 이내여야 합니다.
이 짧은 시간 안에 천문학 계산을 끝내고 텍스트를 렌더링해서 응답을 줘야 한다는 뜻이죠.
개발자인 알렉스(Alexander Yankov)는 이를 위해 아주 영리한 방식을 택했습니다.
먼저 Blender를 이용해 3D 달 모델을 다양한 각도와 거리로 렌더링했습니다.
그 이미지들을 Chafa라는 도구를 이용해 ASCII로 변환해 두었죠.
그리고 요청이 들어오면 astronomy-engine이라는 경량 라이브러리로 천체 위치를 계산한 뒤, 가장 적합한 프레임을 초고속으로 서빙합니다.
제한된 리소스 안에서 최고의 결과물을 내기 위한 고민이 엿보이는 대목입니다.
서버리스 함수(Serverless Function)의 콜드 스타트나 비용 문제를 핑계로 대지 않고, 제약 사항을 오히려 엔지니어링 챌린지로 받아들인 것이죠.
사실 현업에서 일하다 보면 이런 프로젝트를 보며 "이게 돈이 되나?"라는 생각부터 하게 됩니다.
BM(비즈니스 모델)이 뭐냐, 트래픽은 얼마나 나오냐, 이런 잣대를 들이대곤 하죠.
하지만 가끔은 이런 '쓸모없지만 아름다운' 기술이 개발자의 심장을 뛰게 합니다.
우리가 처음 코딩을 배웠을 때를 떠올려보세요.
화면에 "Hello World" 한 줄 찍히는 게 신기해서 밤을 새우던 그 시절 말입니다.
이 프로젝트는 복잡한 MSA(마이크로서비스 아키텍처)나 거창한 AI 모델 없이도, 코드 몇 줄로 사람에게 감동을 줄 수 있다는 사실을 상기시켜 줍니다.
지금 당장 터미널을 켜보세요.
그리고 삭막한 로그 대신, 오늘 밤하늘의 달을 한번 띄워보시는 건 어떨까요?
혹시 압니까.
그 흑백의 달빛 아래서 안 풀리던 버그의 실마리가 보일지도 모릅니다.
저도 오랜만에 머리 좀 식힐 겸, 제 터미널에 뜬 달을 보며 커피나 한 잔 마셔야겠습니다.


