대부분의 디스코드 봇은 사용자를 텍스트 박스 안에 가둬둡니다. 노래를 틀고 싶다? 명령어를 칩니다. 스킵하고 싶다? 또 다른 명령어를 칩니다. 다음에 뭐가 나오는지 보고 싶다? 외우고 있기를 바라야 합니다. 큐를 한눈에 볼 방법이 없거든요.
Cadenza는 Lunive가 처음으로 출시한 제품이고, 시작은 단순한 불편함이었습니다. 채팅 명령어로 음악을 다루는 건 경험이 아니라 우회로입니다. 봇은 존재하지만, 진짜 제품은 봇과 함께 따라오는 웹 인터페이스 — 지금 일어나는 모든 걸 실제로 보고 다룰 수 있는 전용 대시보드입니다.
무엇을 만들었고, 왜 대시보드가 핵심인지, 만들면서 무엇을 배웠는지 적어둔 글입니다.
채팅 기반 조작의 한계
슬래시 명령어는 합리적인 출발점입니다. 빨리 칠 수 있고, 발견하기 쉽고, 사용자 쪽에 별도 설정이 필요 없습니다. 음성 채널 참여, 특정 곡 재생 같은 단발성 동작에는 충분합니다.
문제는 그 이상을 하려는 순간 시작됩니다. 큐 전체를 한눈에 볼 수 없습니다. 재생 중에 다른 곡을 찾으려면 하던 일을 멈추고, 채팅에 검색어를 치고, 텍스트로 결과를 읽고, 다시 명령어로 골라야 합니다. 피드백 루프가 느리고, 정신적 부담이 쌓입니다.
Cadenza의 전제는 단순합니다. 음악 조작은 자기만의 인터페이스를 가질 자격이 있다는 것. 텍스트 박스가 아니라, 큐·검색·재생·가사·볼륨이 한 화면에 동시에 보이고 닿는 표면 — 명령어 없이 다 되는 곳.
대시보드가 제공하는 것
디스코드에서 /play를 입력하면 Cadenza는 음성 채널에 들어가고 URL을 돌려줍니다. 그 청취 세션을 위한 비공개 대시보드입니다. 어떤 브라우저에서 열어도 필요한 모든 게 한 곳에 있습니다.
검색은 거기 있습니다. 곡명을 치거나 URL을 붙여넣으면 결과가 즉시 나옵니다. 큐는 전체가 보입니다. 재생 컨트롤 — 재생, 일시정지, 스킵, 되감기, 셔플, 반복 — 은 항상 화면에 있습니다. 재생되는 곡에 맞춰 가사가 흘러가고, 줄을 누르면 그 시점으로 바로 이동합니다. 앨범 아트가 배경의 색조를 바꿔서, 대시보드가 컨트롤 패널이 아니라 곡 자체처럼 느껴집니다. 볼륨은 명령어가 아니라 슬라이더입니다.
대시보드의 모든 동작은 디스코드에 즉시 반영됩니다. 봇과 인터페이스는 늘 동기화돼 있습니다. 누군가 대시보드에서 스킵하면 음성 채널이 곧바로 반응합니다. 지연도, 새로고침도 없습니다.
어떻게 만들었는지
Cadenza는 두 부분으로 이뤄진 모노레포입니다. 디스코드 봇과 대시보드를 위한 Next.js 웹 애플리케이션. 그 사이에 작은 실시간 계층이 있어, 곡이 진행되는 동안 상태를 양쪽으로 흘려보냅니다. 타입스크립트는 처음부터 끝까지 사용했습니다. 형식이 아니라, 봇과 대시보드를 동기화 상태로 유지하는 일이 타입 안정성을 선택이 아닌 도구로 만들었기 때문입니다.
오디오 쪽은 스트리밍과 재생 효과(5밴드 EQ, 베이스 부스트·나이트코어 같은 프리셋)를 처리해서 봇 본체는 가볍게 유지됩니다. 가사는 여러 출처를 차례로 시도하는 폴백 체인으로 가져옵니다. 어떤 출처에 곡이 없어도 다음 출처에서 받아와, 대중적이지 않은 곡이라도 대체로 가사가 표시됩니다.
이 프로젝트는 AI 보조 프로그래밍에 대한 일종의 실험으로 시작했고, 그 점은 솔직하게 말해두고 싶습니다. AI 에이전트는 많은 보일러플레이트와 스캐폴딩을 처리했습니다. 아키텍처 결정, 디버깅, 제품이 어떤 일을 해야 하는가에 대한 판단은 우리에게 남았습니다. AI 에이전트와 함께 만든다는 건 일이 사라지는 게 아니라, 일이 옮겨지는 일이었습니다.
AI와 함께 코딩한다는 것
AI와 함께 코딩하는 건 분명 생산성을 끌어올립니다. 피드백 루프가 짧아지고, 보일러플레이트가 빨리 사라지고, 며칠 걸릴 기능이 몇 시간으로 줄어듭니다. 하지만 AI에게 전부 맡기는 데에는 진짜 위험이 있습니다. 프로젝트가 사용자에게서 멀어지고, 사용자의 이해도 같이 멀어집니다. 결국 설명할 수 없는 코드, 변호할 수 없는 아키텍처, 디버깅할 수 없는 버그가 남습니다. 생산성 이득은 본인이 빚인지도 모르는 기술 부채로 변합니다.
Cadenza는 일부분 AI로 만들었습니다. 저는 대학생이고, 백엔드와 서버 인프라는 제가 가장 강한 분야가 아닙니다. 하지만 프로젝트를 던져두고 떠나지 않았습니다. 개념을 먼저 공부하고, 직접 코드를 쓰고, 그다음 AI로 개선했습니다. AI가 이해되지 않는 코드를 내놓으면 그냥 받아들이지 않았습니다. 옆에 두고, 질문하고, 무엇을 왜 하는지 설명할 수 있게 된 뒤에 다음으로 넘어갔습니다. 그 과정은 그냥 돌리는 것보다 느렸습니다. 그게 핵심이기도 했습니다.
AI 도구는 빠르게 발전하고 있습니다. 에이전트는 이제 대신 웹사이트를 돌아다니고 대신 행동합니다. Cursor나 Claude Code 같은 에디터는 설명만으로 기능을 통째로 만듭니다. 능력의 천장은 빠르게 올라가고 있고, 앞으로도 계속 올라갈 겁니다. 하지만 가장 중요한 것은 변하지 않았습니다 — 무언가를 만들고 있다면, 그것을 이해하고 있어야 합니다. AI는 파트너로서 가장 잘 작동합니다. 사용자가 할 수 있는 일을 확장해주는 도구지, 사용자 대신 만들어주는 도구가 아닙니다. 자신의 프로젝트를 이해하지 못하는 순간, 그건 더 이상 만들고 있는 게 아닙니다. 누군가가 대신 만드는 걸 지켜보고 있는 것뿐입니다.
마치며
Cadenza는 작은 제품이고, 진짜 불편함을 푸는 것을 목표로 만들었습니다. 채팅 명령어는 단순한 일을 하는 봇에는 충분합니다. 음악처럼 — 둘러보고, 가사를 보고, 대화를 끊지 않고 볼륨을 조절하고 싶은 — 일에는 부족합니다.
대시보드는 봇에 덧붙인 부가 기능이 아닙니다. 봇이 존재하는 이유 자체입니다. 슬래시 명령어는 시작하는 방식이고, 대시보드는 실제로 머무는 곳입니다. 그 구분이 만드는 동안의 모든 결정을 끌고 갔습니다.