본문 바로가기
cutty.dev
All posts

cutty.dev의 기술 스택 — 의도된 선택들

cutty.dev의 내부 구조는 무엇이며 그 이유는 무엇인가. 선동 없이 — 철학: 지루하고 안정적인 스택, EU 내 호스팅, 그리고 혼자서도 유지 관리 가능한 아키텍처에 설계된 프라이버시.

대부분의 "나의 기술 스택(my tech stack)" 게시물은 자랑스러운 신기술 목록입니다. 보세요, 나는 이걸 가지고 있고, 저것도 가지고 있으며, 여기 지난주에 나온 따끈따끈한 라이브러리도 있습니다. 이번에는 다를 것입니다.

사실 혼자 프로젝트를 운영할 때는 가장 유행하는 것을 찾지 않기 때문입니다. 당신이 찾는 것은 새벽 3시에 잠을 깨우지 않을 무언가입니다. cutty.dev의 기술 스택은 바로 그것을 지향합니다: 유행 대신 지루함을, 미국식 대신 유럽식을, 근본부터 프라이버시를 중시하며, 혼자서도 충분히 감당할 수 있을 만큼 단순한 것을 추구합니다.

커피 한 잔 마시며 설명해 드리는 것처럼 차근차근 말씀드릴게요.

서버에서 렌더링되는 Astro (그리고 왜 더 "멋진" 것이 아닌가)

cutty.dev는 서버 사이드 렌더링을 지원하는 Astro입니다. 모든 요청은 서버를 거쳐 페이지를 구성하고 완성된 HTML을 반환합니다. 지루하다고요? 바로 그게 핵심입니다.

나는 세 가지를 원했습니다: 무거운 장치 없는 서버 사이드 렌더링, 즉시 사용 가능한 제대로 된 다국어 지원, 그리고 오버헤드 없는 속도입니다. Astro는 이 모든 것을 제공하며, 코드는 읽기 쉬운 상태로 유지됩니다. 두 달간의 공백 후에 다시 돌아왔을 때, 나는 그 안에서 어떤 일이 일어나고 있는지 바로 알 수 있습니다. 1년만 지나면 아무도 지원하지 않는 그 어떤 유행하는 플러그인보다, 솔로 프로젝트에서는 이것이 훨씬 더 가치가 있습니다.

불꽃놀이가 있는 데이터베이스 대신 단 하나의 파일

SQLite. 하나의 데이터베이스, 디스크 상의 하나의 파일. 여기에 TypeScript와 통신하는 쿼리 레이어까지 더해져서, 데이터 구조를 변경하면 자정의 운영 환경이 아닌 에디터에서 바로 에러를 확인할 수 있습니다.

왜 하필 이것인가요? cutty는 "read-heavy"입니다. 누군가 단축 링크를 클릭하면, 우리는 읽기 작업을 수행하고 카운터를 올립니다. 그게 전부입니다. SQLite는 정말 큰 일일 트래픽까지도 여유롭게 처리합니다. 백업은요? 파일을 복사하면 됩니다. 끝입니다. 복제(replication) 절차도 필요 없고, 아무도 어떻게 작동하는지 기억하지 못하는 스크립트도 필요 없습니다.

여기서 한 가지만 주의하세요. 흔히 빠지는 함정이 하나 있습니다: 사람들은 "SQLite"라는 말을 들으면 "과제용 장난감"이라고 생각합니다. 하지만 그렇지 않습니다. 움직이는 부품이 적을수록 망가질 요소도 적어집니다. 이것은 품질을 아끼는 것이 아니라, 의도적인 결정입니다.

서버는 유럽에 위치해 있으며 이는 우연이 아닙니다

EU 내 전용 서버. 자체 TLS, 자동 HTTPS를 지원하는 리버스 프록시, 컨테이너 기반 애플리케이션.

이것은 cutty가 데이터를 처리하는 방식의 근간입니다. 저는 데이터가 물리적으로 어디에 위치해 있는지 정확히 알고 있으며 (EU 및 GDPR 준수가 필요한 고객들에게 이는 단순한 흥미로운 사실이 아니라 필수 조건입니다), 특정 공급업체에 종속되지 않으며, 데이터가 자동으로 해외로 유출되지 않고, 비용은 트래픽에 따라 급등하는 대신 예측 가능합니다.

네, 서구의 편리한 플랫폼들이 더 빠른 시작을 가능하게 했을 것입니다. 클릭하고, 배포하면, 작동하죠. 다만 그 대가로 사용자 데이터가 어디에 저장될지를 지불해야 합니다. 저에게 그것은 나쁜 거래였습니다.

자신만의 모델을 직접 번역하기

cutty는 25개 언어로 말합니다. 이는 제 인프라에서 실행되는 로컬 오픈 소스 AI 모델을 통해 번역됩니다. 인터페이스의 텍스트를 외부 제공업체로 전송하지 않습니다.

이점은 실용적입니다. 단일 번역 비용은 0원입니다. 저는 품질을 완전히 제어할 수 있으며 원할 때 언제든 업데이트할 수 있습니다. 그리고 기계에는 항상 사람의 눈이 필요하므로, 이 25개 언어 모두 검토를 거쳤습니다. 하지만 제가 직접 수행한다는 사실은 프라이버시가 가격표의 항목이 아님을 의미합니다. 그것은 전체 시스템이 구축된 방식의 속성입니다.

Tailwind, 컨테이너 그리고 몇 가지 작은 결정들

스타일? Utility-first, 즉 Tailwind입니다. CSS-in-JS도 없고, 별도의 스타일 파일도 없으며, 모든 것이 템플릿 안에 바로 들어있습니다. 클래스 이름을 고민하며 시간을 낭비하지 않고, 사용되지 않은 스타일은 어차피 최종 페이지에 포함되지 않으며, 시스템 자체가 이를 강제하기 때문에 디자인이 일관되게 유지됩니다. 혼자 작업할 때는 사소한 것에 시간을 낭비하지 않는 것이 무엇보다 중요합니다.

배포는 Docker를 사용합니다. 로컬과 운영 환경이 동일하므로 "내 컴퓨터에서는 됐는데"라는 말은 이제 끝입니다. 그리고 만약 필요하다면, 약 30분 안에 전체를 다른 서버로 옮길 수 있습니다. 이식성은 조용한 형태의 독립성입니다.

내가 배운 점

지루한 스택이 승리합니다. Astro, SQLite, Tailwind, 컨테이너. 모든 것이 성숙하고, 검증되었으며, 문서화되어 있습니다. 가장 필요하지 않은 순간에 아무것도 무너지지 않습니다.

EU 호스팅은 정말로 프로덕션 준비가 되어 있습니다. "진지하게 임하려면 거대한 미국 클라우드로 가야 한다"는 말은 그저 환상일 뿐입니다. 로컬 AI 또한 현실적이며, 괜찮은 번역 결과를 얻기 위해 데이터를 외부 API에 넘겨줄 필요도 없습니다. 그리고 마지막으로: 한 사람이 팀 전체가 만든 것 같은 결과물을 내놓을 수 있습니다. 다만 시간은 돈보다 더 비싸다는 점을 기억하고, 그 관점에서 모든 요소를 신중히 선택해야 합니다.

자신만의 무언가를 구축할 때, 모든 기술에 대해 스스로에게 한 가지 질문을 던져보세요: 1년 뒤에도 내가 이것을 혼자서 유지 관리할 수 있을까? 만약 그렇지 않다면, 아마 답은 이미 나와 있는 것입니다.

모든 것은 여기에서 작동합니다: cutty.dev. 만약 이 결정들 중 하나에 대해 이야기하고 싶다면, [email protected]로 메일을 보내주세요. 당일에 답장 드립니다.