본문 바로가기
728x90
SMALL

전체 글573

프로필 온보딩 로직 설계하기: ViewModel 책임 분리와 검증 로직의 경계 프로필 온보딩 ViewModel 설계 점검 기록소셜 로그인을 구현한 뒤, 다음으로 마주한 문제는“사용자 프로필을 언제, 어떻게 작성하게 할 것인가”였다. 이 글은 Firebase 기반 iOS 앱에서프로필 온보딩을 담당하는 ViewModel을 설계하며 고민했던 로직과,그 로직을 역할과 책임 관점에서 점검하며 정리한 기록이다. 1. 처음에 생각했던 프로필 온보딩 로직처음 설계한 흐름은 다음과 같았다.사용자가 소셜 로그인을 완료한다.HomeViewController로 이동한다.이 시점에 Firestore에 사용자 프로필이 존재하는지 확인한다.프로필이 없다면,UISheetPresentationController (detent: .medium) 방식으로ProfileViewController를 표시한다.사용자는 다.. 2026. 1. 6.
FirebaseProfileImageUploader 설계 — 프로필 이미지를 왜 분리해야 하는가 사용자 프로필을 구현할 때 가장 흔한 실수 중 하나는프로필 이미지 업로드 로직을 Firestore 사용자 저장 로직과 섞어버리는 것이다. 이 글에서는 Firebase를 사용하는 iOS 앱에서프로필 이미지 업로드를 왜 별도의 계층으로 분리했는지,그리고 그 결과물인 ProfileImageUploading 프로토콜과FirebaseProfileImageUploader 구현체를 어떻게 설계했는지를 정리한다. 1. 문제 정의: 프로필 데이터에는 두 종류가 있다사용자 프로필을 구성하는 데이터는 크게 두 가지로 나뉜다.1️⃣ 구조화된 데이터사용자 이름프로필 이미지 경로기타 메타 정보👉 Firestore에 저장 2️⃣ 바이너리 데이터프로필 이미지 파일 (UIImage)👉 Firebase Storage에 저장 이 둘을.. 2026. 1. 5.
FirestoreUserRepository 설계 — 사용자 프로필을 안전하게 관리하는 방법 소셜 로그인(Google / Apple / Kakao / Naver)을 Firebase Authentication으로 구현한 뒤,다음으로 해결해야 할 문제는 “사용자 프로필을 어디서, 어떻게 관리할 것인가”였다. 이 글에서는 Firebase Firestore를 사용하는 iOS 앱에서FirestoreUserRepository를 왜 도입했고, 어떤 기준으로 설계했는지를 정리한다. 특히 이번 단계에서 반드시 기억해야 할 핵심 포인트들을 함께 다룬다. 1. 왜 FirestoreUserRepository가 필요한가?가장 단순한 구현은 ViewModel에서 Firestore를 직접 호출하는 것이다.Firestore.firestore() .collection("users") .document(uid) .. 2026. 1. 4.
UserRepository 설계 — Firebase 프로필 데이터를 어떻게 다룰 것인가 소셜 로그인(Google / Apple / Kakao / Naver)을 Firebase Authentication으로 구현한 뒤,다음으로 마주한 문제는 “사용자 프로필 데이터를 어떻게 관리할 것인가”였다. 이 글에서는 Firebase Firestore를 사용하는 환경에서사용자 프로필을 다루기 위한 UserRepository 프로토콜을 왜, 어떻게 설계했는지를 정리한다.특히,Repository를 왜 도입했는지async/await를 선택한 이유completion handler 방식과의 차이로그아웃 / 회원 탈퇴 시 캐시 처리 설계를 중심으로 설명한다. 1. 왜 UserRepository가 필요한가?가장 단순한 방식은 ViewModel에서 Firestore를 직접 호출하는 것이다.Firestore.firest.. 2026. 1. 3.
Firebase 기반 사용자 프로필 관리 전략 — 서버 단일 소스 + 세션 캐시 소셜 로그인(Google, Apple, Kakao, Naver)을 Firebase Authentication으로 구현한 뒤,다음으로 반드시 고민하게 되는 주제가 있다.“사용자 프로필 정보는 어디에, 어떻게 저장하고 관리해야 할까?” 이 글에서는 Firebase Firestore를 단일 소스(Single Source of Truth)로 두고,앱에서는 세션 단위 메모리 캐시만 사용하는 프로필 관리 전략을 정리한다. 1. 문제 상황 정리현재 앱의 구조는 다음과 같다.인증(Auth): Firebase Authentication사용자 프로필: Firestore에 저장프로필 이미지: Firebase Storage사용자는 로그인 후 프로필을 작성하고,그 정보는 Firestore에 저장된다.여기서 자연스럽게 떠오르는 .. 2026. 1. 3.
PulseUser 모델 설계 — Firebase Auth 이후 사용자 프로필을 어떻게 정의할 것인가 소셜 로그인(Google, Apple, Kakao, Naver)을 Firebase Authentication 기반으로 구현한 뒤,다음 단계로 반드시 마주하게 되는 질문이 있다.“로그인이 끝난 사용자를, 서비스에서는 어떤 모델로 표현해야 할까?” Firebase Auth에는 이미 User 객체가 존재한다.그렇다면 이 User를 그대로 써도 되는 걸까? 이 글에서는 Firebase Auth의 User와 분리된 서비스 레벨 사용자 모델 PulseUser를 왜, 어떻게 설계했는지를 정리한다. 1. Auth User ≠ 서비스 User가장 먼저 명확히 해야 할 개념은 이거다.Firebase Authentication의 User는 ‘인증 객체’이지,서비스에서 사용하는 사용자 프로필이 아니다. Firebase Aut.. 2026. 1. 3.
소셜 로그인 이후 프로필 작성 온보딩 설계 (Firebase Auth + Firestore + Storage) 소셜 로그인(Google / Apple / Kakao / Naver)을 모두 구현한 뒤,다음으로 고민해야 할 것은 **“로그인 이후 사용자를 어떻게 서비스에 진입시킬 것인가”**이다. 단순히 로그인에 성공했다고 해서 바로 서비스를 사용하게 만드는 것이 항상 최선은 아니다.대부분의 서비스는 로그인 이후 최소한의 사용자 프로필 정보를 요구한다. 이 글에서는 Firebase Auth 기반 소셜 로그인 이후, 최초 1회만 프로필 작성 화면을 노출하는 온보딩 로직을 어떻게 설계했는지 정리한다. 1. 문제 정의현재 앱의 상태는 다음과 같다.Firebase Auth로 소셜 로그인 완료 가능uid 발급 및 인증 상태 관리 가능아직 서비스 레벨의 “회원 프로필”은 존재하지 않음이 상태에서 발생하는 질문은 하나다.“로그인.. 2026. 1. 1.
Firebase Functions로 카카오/네이버 소셜 로그인 Custom Token 발급하기 문제: iOS에서 소셜 accessToken만으로 Firebase 로그인할 수 없을까?iOS에서 카카오/네이버 로그인에 성공하면 accessToken을 얻는다.하지만 Firebase Auth는 이 accessToken을 직접 받아 로그인할 수 없다(Apple/Google 제외 케이스).대신 Firebase는 Custom Token 로그인을 제공하는데, 이 토큰은 신뢰된 서버에서만 생성 가능하다.즉, 필요한 구조는 다음과 같다.iOS에서 소셜 로그인 후 accessToken 획득iOS → Cloud Functions로 accessToken 전달Functions가 발급자(Kakao/Naver) API로 토큰을 검증검증된 사용자에 대해 Firebase Custom Token 발급iOS가 Custom Token.. 2025. 12. 31.
Git에서 push / pull / merge 순서가 꼬였을 때 — 원인과 실무적 해결 전략 개인 프로젝트에서 네이버 로그인 기능을 구현한 뒤feature 브랜치를 main에 머지하는 과정에서 다음과 같은 에러를 마주했다.! [rejected] main -> main (fetch first)Updates were rejected because the remote contains work that you do not have locally. 혼자 작업하는 저장소인데 왜 이런 에러가 발생했을까?그리고 이런 상황은 실무에서 문제가 될까? 이번 글에서는 실제로 겪은 Git 흐름 꼬임 사례를 바탕으로,원인 분석과 실무에서 사용하는 예방 전략까지 정리해본다. 1. 문제 상황 요약작업 흐름은 대략 다음과 같았다.feature/firebase-auth-naver 브랜치에서 작업 완료GitHub에서 Pull R.. 2025. 12. 31.
🔐 iOS 네이버 로그인 키 관리 방법 (xcconfig + Info.plist + ClientConfiguration) 네이버 로그인을 구현하면서 가장 신경 써야 하는 부분 중 하나는Client ID, Client Secret 같은 민감한 키를 어떻게 관리할 것인가다.이번 글에서는xcconfig + Info.plist + 코드 분리 구조를 사용해네이버 로그인 키를 안전하고 깔끔하게 관리하는 방법을 정리한다. ✅ 목표 구조 요약우리가 최종적으로 만든 구조는 아래와 같다.Secrets.xcconfig (실제 값, Git 추적 ❌) ↓ (Build Time 치환)Info.plist ($(VAR) 형태로 참조) ↓ (Runtime)ClientConfiguration (코드에서 안전하게 접근) ↓AppDelegate (SDK 초기.. 2025. 12. 30.
🤔 SocialAuthCoordinator 생성 조건 및 구조 설계 1️⃣ SocialAuthCoordinator를 만든 이유 (왜 이 클래스가 필요했나)소셜 로그인은 한 단계짜리 작업이 아니다.카카오 로그인을 예로 들면 실제 흐름은 이거야:Kakao SDK → accessToken 발급서버(Firebase Functions) → accessToken 검증서버 → Firebase Custom Token 생성앱 → Firebase Auth signInFirebase Auth → 인증 상태 변경👉 “로그인”이라는 말 하나에 4~5개의 책임이 섞여 있음 ❌ Coordinator가 없을 때의 문제만약 이걸 AuthService 하나에 몰아넣으면:Kakao / Naver SDK를 알아야 하고Firebase Functions 호출을 알아야 하고Custom Token 구조를 알아야.. 2025. 12. 29.
🤔 async, await VC CompletionHandler 언제 써야하나?(KakaoAuthHandler) https://developers.kakao.com/docs/latest/ko/ios/getting-started Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.comhttps://developers.kakao.com/docs/latest/ko/kakaologin/common Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com 구글에 겅색해보면, "카카오 로그인"을 async/await로 구현한 블로.. 2025. 12. 28.
🎫 KakaoAuthHandler 는 왜 async/await를 버리고 completion 기반으로 되돌렸나? 기존 로그인 구현 코드private extension KakaoAuthHandler { /// 카카오톡 로그인 /// /// Kakao SDK의 callback 기반 API를 /// Swift async/await 스타일로 래핑합니다. func loginWithKakaoTalk() async throws -> String { try await withCheckedThrowingContinuation { continuation in UserApi.shared.loginWithKakaoTalk { oauthToken, error in // 1️⃣ Kakao SDK 에러 발생 .. 2025. 12. 28.
✅ Kakao 로그인 전체 로직 흐름 (파일 순서 기준) 0️⃣ 출발점 — 사용자 액션사용자 └─ LoginViewController └─ 카카오 로그인 버튼 탭 1️⃣ LoginViewController역할UI 이벤트 처리“카카오로 로그인하겠다”는 의도만 전달인증 로직은 절대 모름authViewModel.login( provider: .kakao, from: self)LoginViewController⬇️AuthViewModel 2️⃣ AuthViewModel역할View ↔ Service 중계Auth 상태 관찰 (onAuthStateChanged)에러 전달authService.login( with: .kakao, from: presentationContext, completion: ...)AuthViewModel⬇️AuthS.. 2025. 12. 28.
Firebase Functions + Kakao 로그인 문제 해결 정리 문제 상황 요약카카오 로그인을 구현하면서 다음과 같은 현상이 발생했다.✅ 카카오 SDK 로그인 성공✅ accessToken 정상 발급❌ Firebase Functions 호출 시 실패❌ iOS에서는 항상 아래 에러만 발생FunctionsError(code: INTERNAL)❌ Firebase Auth 로그인 실패❌ 카카오톡 로그인 화면이 바로 닫히고 다시 Login 화면으로 복귀처음에는 index.js 코드 문제, region 설정, 중복 호출, SceneDelegate, Task 구조 등을 의심했다. 1️⃣ 처음 사용했던 구조 (개선 전)Firebase Functions (개선 전)const { onRequest } = require("firebase-functions/v2/https");exports.. 2025. 12. 27.
728x90
LIST