Linear가 나를 로컬-퍼스트 rabbit hole로 이끌었음

1 month ago 11

  • Linear를 사용하면서 웹 애플리케이션 개발 방식에 대한 시각이 크게 바뀌었음
  • Linear는 로컬-퍼스트 방식으로 동작해 즉각적인 반응과 네트워크 지연 없는 인터랙션을 제공함
  • 이 방식은 클라이언트가 독립적인 데이터베이스를 가지며, 변경사항은 비동기적으로 서버와 동기화함
  • 하지만 분산 환경에서의 동기화, 충돌 해결, 오프라인 처리 등 구현 난이도가 높음
  • Jazz, Electric SQL, Zero 등 로컬-퍼스트 생태계의 다양한 솔루션이 등장하고 있으며 개발자 경험도 점차 개선되고 있음

개요

Linear라는 프로젝트 관리 툴을 사용하며, 로컬-퍼스트 방식의 탁월한 속도와 사용자 경험에서 큰 영감을 받음. 기존 웹 앱에서 흔히 겪던 네트워크 지연, 로딩 상태, 페이지 리프레시 등이 전혀 느껴지지 않은 점이 인상적이었음. 이러한 경험을 통해 로컬-퍼스트(local-first) 패러다임의 기술적인 원리와 실제 적용 사례를 깊이 탐구하게 되었음.

Down the Rabbit Hole

Linear의 기술적 비밀을 파헤치면서, 그들은 브라우저의 IndexedDB를 실제 데이터베이스처럼 활용하고 있다는 사실을 알게 됨. 모든 변경은 로컬에서 먼저 즉시 처리되고, 이후 GraphQL과 Websockets를 이용해 백그라운드에서 동기화가 이루어짐.

  • local-first라는 용어는 UX 전략(즉각적 반응성) 또는 데이터 자체를 로컬에 보관하고 싱크하는 철학으로 다양하게 해석될 수 있음
  • 전통적인 웹 앱에서는 서버가 단일 진실의 원천이었지만, 로컬-퍼스트 구조에서는 각 클라이언트가 자체 데이터베이스를 가짐
  • 데이터베이스의 위치가 사용자 근처로 이동하면서, 사용자 인터랙션에서 네트워크 지연이 완전히 제거

The Challenge: This Is Not Trivial

Linear의 방식을 직접 구현하려 시도해보니 복잡도가 상당함을 깨달음.

  • 오프라인/온라인 전환 처리
  • 분산된 클라이언트 간 충돌 해결
  • 부분 동기화(전체 데이터를 내려받지 않기 위한 설계)
  • 캐시 데이터의 스키마 마이그레이션
  • 분산 환경에서의 보안 및 접근 제어
  • 이러한 기능들은 막대한 엔지니어링 시간과 노력이 필요한 영역

The Local-First Ecosystem in 2025

2025년 기준, 로컬-퍼스트 생태계에서는 여러 강력한 솔루션이 등장함.

  • Electric SQL: Postgres를 기반으로 한 싱크 엔진
  • PowerSync: 엔터프라이즈 중심 솔루션
  • Jazz: 로컬-퍼스트 앱을 손쉽게 구축하게 해주는 도구
  • Replicache: 기존 주요 솔루션(개발 종료)
  • Zero: Replicache 팀의 새로운 방향성
  • Triplit: TripleStore 기반 싱크
  • Instant: 개발자 경험에 초점을 맞춤
  • LiveStore: 실시간 동기화 계층 제공

Deep Dive: Jazz

Jazz는 "로컬-퍼스트 앱을 상태 업데이트만큼 쉽게 만든다"는 고유한 약속으로 눈길을 끎.

The Mental Model

Jazz는 Collaborative Values(CoValues) 라는 실시간 협업 구조체를 도입함.

  • Jazz 및 Zod로 스키마를 정의: 이 정의는 단순 타입이 아니라 자동 동기화되는 라이브 객체로 동작
  • 별도의 API 라우트, 요청/응답 로직, DTO 등이 필요 없이 단순히 객체 상태를 바꾸면 자동으로 싱크가 이루어짐

How Jazz Achieves This

Jazz의 내부 구조는 다음과 같음:

  • 유일성 보장: 각 데이터에 고유 ID 자동 할당
  • 이벤트 소싱: 변경 이력을 이벤트로 저장, 실시간 동기화 효율화
  • 종단간 암호화: 동기화 전 클라이언트에서 데이터 암호화. 서버는 암호화된 블롭만 볼 수 있음
  • 그룹 기반 권한 설계: 전통적 ACL 대신 그룹 단위 권한, 소유권이 명확히 구분됨

The Trade-offs

이 구조는 프로토타이핑 및 빠른 UI 개발에 매우 생산적임. 하지만 몇 가지 특성상 고려해야 할 부분이 있음:

Your Server Is Blind

종단간 암호화로 인해 서버는 사용자의 데이터를 읽을 수 없음. 사전에 서버가 접근이 필요한 데이터를 명확히 정의하지 않으면, 감시나 악성 저장 방지 등 관리에 제한이 발생함

Time Travel Is Mandatory

이벤트 소싱으로 인해 모든 변경 이력이 영구 저장됨. 덕분에 Undo/Redo가 매우 편리하지만, GDPR 등 법적 요구사항 고려시 삭제가 어렵다는 단점이 있음

Storage Goes Brrr

삭제가 이루어지지 않아 저장공간 사용량이 점점 증가함. 소규모 프로젝트는 괜찮지만, 대규모 SaaS에서는 저장 비용이 크게 증가할 수 있음

Local Dev Still Has Quirks

Passkeys를 중심으로 한 인증 방식이 기본인데, 자체 개발이나 로컬 환경에서는 HTTPS, 인증서 관리, 키 이전 등 개발 초기에 번거로움이 존재함. 다만 Better Auth 통합 등 개선 예정임

But Honestly? Still Worth It

이러한 제약에도 불구하고, Jazz의 개발 경험과 생산성은 매우 인상적임. 아직 초기 버전이나, 앞으로 다양한 문제들이 점차 해결될 전망임

Exploring: Electric SQL and Zero

Jazz와 달리, Electric SQLZero는 점진적 접근 방식을 취함.

  • 기존 Postgres 테이블 그대로 활용 가능
  • Electric SQL은 테이블의 일부분을 reactive query(Shape)로 구독해 UI에 동기화할 수 있음
  • 변경(뮤테이션) 처리 방법이 Jazz에 비해 다르고, LiveStore 통합 등 다양한 옵션 존재
  • Zero는 Electric과 유사하지만, 변경사항 동기화 지원이 내장됨

When Does Local-First Make Sense?

로컬-퍼스트 패러다임이 적합한 상황과 도전적인 상황을 다음과 같이 정리함

적합함:

  • 창작 도구(디자인, 글쓰기, 음악 등)
  • 협업 지원 애플리케이션
  • 오프라인 지원이 필요한 모바일 앱
  • 개발자 도구
  • 개인 생산성 앱

도전적임:

  • 대규모 서버 측 비즈니스 로직
  • 엄격한 감사(Audit) 요구사항
  • 대용량 분석 시스템
  • 깊이 통합된 기존 시스템
  • 서버에서 요청을 자주 거부하는 시스템

Looking Forward

로컬-퍼스트는 웹 개발의 패러다임 전환을 의미함. Linear는 이미 사용자 경험에서 큰 효과를 증명함. 개발자는 이러한 구조적 트레이드오프가 자신의 프로젝트에 적합한지 판단해야 함.

Jazz로 직접 퍼스널 앱을 제작하며 실제 장단점과 추상화의 한계를 체험 중임. 생태계는 아직 초기 단계로, 향후 도구와 패턴이 성숙하며 개선될 것임. 그러나 데이터를 로컬에 두는 방식의 이점은 명확하며, 이는 사라지지 않을 전망임.

새로운 프로젝트에서 제약을 수용할 수 있다면 로컬-퍼스트를 경험해볼 가치가 충분함. 최악의 경우 새로운 아키텍처 패턴을 학습하게 되고, 최선의 경우 불가능할 정도로 빠른 사용자 경험을 구현할 수 있음. 300ms 응답 경쟁에서 이는 중요한 이점이 됨.

Read Entire Article