개발

삐삐북 개발기 5편 — 로그인 없이도 쓸 수 있게: 로컬 유저와 인증 설계

2026-05-08·2분 읽기
삐삐북 개발기 5편 — 로그인 없이도 쓸 수 있게: 로컬 유저와 인증 설계

애플 로그인은 선택이 아니다

구글 로그인을 넣으면서 자연스럽게 애플 로그인도 추가해야 했습니다.

앱스토어 정책상, 서드파티 로그인(구글, 페이스북 등)을 제공하는 앱은 반드시 애플 로그인도 함께 제공해야 합니다. 안 넣으면 심사에서 반려됩니다.

구현 자체는 어렵지 않았습니다. Firebase Authentication과 연동하면 되고, Swift에서 AuthenticationServices 프레임워크를 사용합니다. 구글 로그인과 비슷한 패턴으로 처리할 수 있었습니다.


로그인 없이 쓸 수 있어야 한다

로그인 기능을 만들면서 한 가지 생각이 들었습니다.

"로그인이 귀찮아서 앱을 쓰지 않는 사람이 있을 것이다."

앱을 처음 켰을 때 로그인 화면이 나오면, 그냥 닫아버리는 사람이 있습니다. 특히 처음 보는 앱에서 계정을 만들거나 소셜 로그인을 하는 게 번거롭게 느껴지는 분들이 있습니다.

"일단 써봐야 쓸지 말지 결정할 수 있는데, 로그인부터 해야 하면 시도도 안 한다."

그래서 "로그인 없이 사용하기" 버튼을 추가했습니다. 로그인 없이도 앱의 모든 기능을 쓸 수 있고, 데이터는 기기 내부(Realm Swift)에 저장됩니다.


로컬 모드의 기술적 선택: Realm Swift

로그인 유저의 데이터는 Firebase Firestore에 저장합니다. 하지만 로컬 유저의 데이터는 서버에 저장할 수 없습니다.

로컬 DB로 Realm Swift를 선택했습니다. 3weeks 앱에서도 쓴 적 있고, iOS에서 사용하기 편한 로컬 데이터베이스입니다.

문제는 Firestore와 Realm의 데이터 구조가 다르다는 것입니다.

Firestore는 NoSQL 문서 기반 DB고, Realm은 객체 기반 로컬 DB입니다. 같은 "책 기록"이라도 저장 방식과 모델 구조가 달라집니다.

앱 내부 코드에서는 두 DB를 추상화해서 동일한 방식으로 다룰 수 있도록 했습니다. 로그인 상태에 따라 Firestore를 쓸지 Realm을 쓸지 분기하는 방식으로요.


아직 해결 못한 문제: 로컬 → 클라우드 마이그레이션

로컬 모드로 쓰다가 나중에 로그인을 하면 어떻게 될까요?

이상적으로는 로컬에 저장된 데이터가 Firestore로 이전되어야 합니다. 쌓아온 독서 기록이 날아가면 안 되니까요.

이 마이그레이션을 구현하려 했는데, 생각보다 복잡했습니다.

Realm의 데이터 구조와 Firestore의 데이터 구조가 미묘하게 다르다 보니, 단순히 데이터를 복사하는 게 아니라 변환이 필요합니다. 그리고 마이그레이션 중 실패하면 데이터를 잃을 수 있어서 안전하게 처리하는 로직도 필요합니다.

완벽한 구현을 하지 못한 채로 출시했고, 이 부분은 아직도 미해결 과제로 남아 있습니다. 로컬 유저가 로그인을 하면 기존 데이터는 이전되지 않고 새로 시작하게 됩니다.

이게 사용자 경험상 아쉬운 부분입니다. 언젠가는 해결해야 할 문제입니다.


로그인 없이 써보고 마음에 들면 계정을 만든다

처음부터 계정을 만들게 강제하지 않는 방식이 효과가 있었습니다.

로그인 없이 앱을 써보다가, 다른 기기에서도 쓰고 싶거나 데이터를 백업하고 싶어지면 그때 로그인합니다. 이 흐름이 자연스럽습니다.

다만 앞서 말한 마이그레이션 문제 때문에, 로컬 데이터가 사라진다는 걸 미리 안내하는 게 중요합니다. 이 부분의 UX는 계속 개선 중입니다.