2. 어떤 기술을 사용할까?

기술 스택을 선정하기 전에 가장 중요하게 생각한 것은 '이게 과연 필요한가?', '최소한으로 해결할 수 있는가?'였다. 미니멀리즘하게 정말 필요한 기술 스택만 선정했다.

프론트엔드

Tanstack Start

풍부한 생태계 덕분에 개발 생산성을 높여주는 다양한 편의 기능을 제공하는 Next.js를 오랫동안 사용했다. 하지만 시간이 지나면서 점점 무거워지는 아키텍처는 다소 부담스럽게 느껴졌다. 또한, 대부분의 사용자들이 느끼는 문제로 느린 개발 서버는 여전히 고질적인 문제였고 너무 답답했다.

반면 TanStack Start는 아직 생태계가 비교적 초기 단계이지만, 개발자 경험 측면에서는 훨씬 더 만족스러웠다. 애플리케이션 전반에 걸쳐 완전한 타입 안전성을 제공하며, 결과물 또한 매우 가볍다. 이러한 장단점을 고려했을 때, 이번 프로젝트에는 TanStack Start가 더 적합한 선택이라고 판단했다.

무엇보다 AI가 빠르게 발전되는 흐름 속에서 기술 스택은 더 이상 크게 중요하지 않다고 생각한다.* *8.6 update) Next.js 16.3에서 메모리 사용량, 누수를 획기적으로 줄였고 속도도 빨라졌다고 한다. → 후속 서비스인 Foundly는 Next.js 채택

Tailwind CSS

유틸리티 기반의 접근 방식은 매우 직관적이고 사용하기 쉽다. 또한 높은 수준의 커스터마이징이 가능하다. 덕분에 프로젝트의 개성을 살리면서도 완성도 높은 UI를 구현할 수 있다.

Shadcn

Base UI와 Panda CSS를 사용해 직접 디자인 시스템을 구축해 보려했다. 하지만 웹 표준과 접근성에 대해 학습해야 할 내용이 너무 많았고, 생각보다 훨씬 깊은 영역이라는 것을 깨달았다. 더 진행하는 것은 오히려 rabbit-hole 난관에 봉착하게 만들었다.

그래서 오랫동안 사용해 온 shadcn/ui를 선택했다. 필요한 대부분의 UI 컴포넌트를 제공할 뿐만 아니라, 최신 웹 표준과 접근성 모범 사례를 충실히 따르고 있다. 또한 Tailwind CSS와도 매우 자연스럽게 통합되기 때문에, 디자인 시스템을 처음부터 직접 구축하지 않고도 일관성 있고 유지보수하기 쉬운 인터페이스를 만들 수 있다.

Motion

Motion은 React와 뛰어난 궁합을 제공하고, 필요한 대부분의 UI 애니메이션을 별도의 복잡한 설정 없이 구현할 수 있었다. 유사한 라이브러리로 GSAP이 있는데 엄청 강력하고 자유도가 높은 것으로 알고 있다. 하지만, 요구사항에는 과한 옵션이었다.

백엔드

Hono

Hono는 Web Standard API를 기반으로 설계된 프레임워크로, Cloudflare Workers 환경과 매우 뛰어난 궁합을 제공한다. 매우 가볍고 빠르며, 의도적으로 최소한의 기능만을 제공하는 것이 특징이다. 또한 표준 Web API를 그대로 따르기 때문에 JavaScript에 익숙한 개발자라면 새로운 프로그래밍 모델이나 거대한 프레임워크를 학습하지 않아도 빠르게 개발을 시작할 수 있다.

NestJS나 Spring과 같은 프레임워크는 성숙한 생태계와 강력한 기능을 제공하지만, 그만큼 높은 학습 비용과 추상화를 동반한다. 그리고 별도의 서버가 필요하다는 점은 진입장벽이었다. (Render 같이 무료로 이용 가능한 배포 플랫폼이 많지만, 콜드 스타트는 너무 치명적이었다) 또한, 이 서비스에는 많은 복잡한 기능이 필요하지 않아서 단순함, 빠른 개발 속도, 그리고 Cloudflare Workers와의 자연스러운 통합을 더욱 중요하게 고려했다.

PostgreSQL(Supabase)

Supabase는 현대적인 웹 애플리케이션에서 가장 널리 사용되는 Backend-as-a-Service(BaaS) 플랫폼 중 하나이다. 특히 넉넉한 무료 플랜을 제공하고, 서울을 포함한 다양한 Region을 제공하기 때문에 선택하지 않을 수 없었다.

어쩌다보니, Cloudflare 제품에 굉장히 강하게 종속되어 버려서 Cloudflare D1을 사용할 수도 있었다. 하지만, 이 서비스는 쓰기 작업이 꽤나 많은 편에 속하고 SQLite 기반 특성상 읽기 중심 워크로드에 더 적합하며, 대량의 동시 쓰기나 복잡한 데이터 모델을 다루는 환경에서는 PostgreSQL보다 제약이 있음을 확인했다. (쓰기 병목, 트랜잭션)

그 외

Cloudflare R2

꽤 많은 이미지, 비디오를 저장해야 하는 특성 상 R2는 강력한 선택지다. 왜냐하면, 무료 플랜임에도 불구하고 월 10GB의 저장 공간, 월 100만 쓰기, 월 1000만 읽기, Egress 무제한 무료를 제공하기 때문이다.

Supabase 도 자체적으로 storage를 제공하지만 1GB 저장 공간, 5GB Egress 라는 제한은 다소 불리했다.

Cloudflare Workers

프론트엔드와 백엔드 모두 Workers를 사용해 배포했다.

Cloudflare Workers는 서버리스 환경이기 때문에 서버를 상시 운영할 필요가 없어 인프라 관리 부담과 비용을 줄일 수 있다. 기존에 사용했던 Render 같은 서비스는 무료 플랜에서 콜드 스타트가 너무 심하고 리전이 제한적이었다. 하지만, Workers는 전 세계 Edge Network에서 요청을 처리할 수 있고 세부적으로 리전 선택도 가능하다. (*서울 리전 제공)

또한, R2, CDN, DNS 등 다양한 서비스를 하나의 생태계에서 함께 사용할 수 있고 충분한 무료 플랜을 제공한다. 하지만 이 모든 장점을 넘어서는 것은 콜드 스타트가 거의 0에 수렴한다는 것이다. 이것만으로도 선택하지 않을 이유가 없었다.

Better Auth

인증은 Better Auth를 사용했다. 간단하며 백엔드와 자연스럽게 통합된다. 또한, 무엇보다 매우 가볍게 설계되어 있어 성능 측면에서도 유리하다. *(Clerk 와 비교하면 매우 빠르고 설정도 쉬움)

무엇보다도 복잡한 설정이나 불필요한 추상화 없이 필요한 인증 기능을 빠르게 구현할 수 있고 필요한 옵션은 플러그인으로 손쉽게 이식할 수 있는 것이 장점이다.