← back to apps

app · iOS

세대백서

세대 간의 백과사전을 연도별로 정리한 앱. 한 해의 유행어 / 사건 / 문화를 펼쳐 보면서 — 다른 세대의 같은 해를 들여다보게 만드는 작은 도구.

SwiftUI Clean Architecture Firebase Realtime DB Git-as-DB AdMob

서비스 소개

세대백서는 — 같은 해를 지나온 사람들 사이의 공통 기억과, 다른 해를 산 사람들 사이의 거리감을 — 한 화면에서 들여다보게 만드는 SwiftUI 앱입니다. 연도를 고르면 그 해의 유행어 / 사건 / 문화 / 가격 같은 항목이 펼쳐지고, 사용자는 자기 세대의 기억을 짚어보거나 다른 세대의 기억을 처음 만나봅니다.

기능보다는 데이터의 운영 방식이 이 앱의 본질에 가깝습니다 — 백과사전이라는 특성상 사용자가 늘면서 콘텐츠가 늘어나야 하지만, 그렇다고 매번 앱 업데이트로 데이터를 밀어 넣을 수도 없는 노릇이었습니다. 그래서 한 가지 실험을 했습니다 — Git 저장소 자체를 데이터베이스처럼 쓰자.

Behind the scenes

만들면서 시도해보고 싶었던 한 가지 — "백엔드 없이 데이터를 자주 갱신할 수 있을까".

  1. 01

    Git 을 DB 처럼 써본 실험

    세대백서는 사용자에게 보여줄 데이터(연도별 백과사전 항목)가 — 출시 후에도 — 자주 보강 / 정정될 수 있어야 했습니다. 보통은 백엔드 + DB 한 쌍을 두지만, 이 앱은 그 정도 트래픽 / 규모가 아니어서 — 별도 인프라를 두는 게 분에 맞지 않았습니다. 그래서 다르게 풀어봤습니다 — 연도별 JSON 파일을 Git 저장소에 두고, 앱은 시작할 때 깃의 raw 컨텐츠를 fetch 해서 데이터를 받아옵니다. 지원 연도 목록조차 깃에서 받아오게 만들어, 새 연도가 추가됐을 때도 앱 업데이트 없이 자동으로 노출되도록 했습니다. 결과적으로 "git push" 한 번이 곧 데이터 배포가 되는 구조 — 별도 어드민 / DB / 서버 비용 없이 콘텐츠를 굴릴 수 있게 됐습니다.

    한계도 분명히 있었습니다 — 가장 큰 건 사용자에게 직접 데이터를 입력받지 못한다는 점입니다. 깃은 운영자(저)가 push 하는 단방향 흐름이라, 사용자가 앱 안에서 무언가를 적어 넣고 그게 곧장 콘텐츠로 들어오는 일은 이 구조로 풀 수 없었습니다. 그래서 사용자 제보 / 문의는 별도로 Firebase Realtime DB 에 받아서, 운영자가 검수 후 깃에 반영하는 식으로 분리했습니다. "어디까지가 깃으로 풀리고, 어디부터는 진짜 DB 가 필요한가" 의 경계를 — 만들면서 손으로 짚어본 시간이었습니다.

Screenshots

카드를 누르면 큰 이미지로 볼 수 있습니다.

More

지나온 버전과 앞으로 들어갈 항목을 별도 페이지에서 확인할 수 있습니다.