https://developers.kakao.com/docs/latest/ko/ios/getting-started
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
https://developers.kakao.com/docs/latest/ko/kakaologin/common
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
구글에 겅색해보면, "카카오 로그인"을 async/await로 구현한 블로그가 있다.
이번 글에서는 왜 내가 구현한 방식에서는 completion Handler를 사용했는지와
앞으로 언제 async/await 또는 completion Handler를 사용할지 정리해보았다.
1️⃣ “근데 async/await로 한 블로그도 있던데요?” → 맞아, 가능은 함
결론부터 말하면:
Kakao 로그인은 async/await로 “구현은 가능”하지만
“항상 안전하진 않다”
그래서 블로그마다 구현이 다른 거야.
2️⃣ 그럼 왜 어떤 사람은 되고, 우리는 안 됐을까?
🔑 차이를 만드는 건 “어디까지 async로 감쌌느냐”야
✔️ 잘 되는 async/await 예제들의 공통점
- 로그인만 단독으로 처리
- SceneDelegate / AppDelegate 로직이 단순
- 로그인 이후 추가 네트워크/서버 인증 없음
- 앱 구조가 비교적 단순 (MVVM + 1~2 레이어)
❌ 내가 만든 구조의 특징
- 카카오 로그인
- → Firebase Functions 호출
- → Custom Token 생성
- → Firebase Auth signIn
- → AuthState 변경
- → RootCoordinator 화면 전환
📌 즉, 비동기 단계가 4~5단계 연쇄적으로 연결됨
이 상태에서
- Kakao SDK callback을
- withCheckedThrowingContinuation으로 감싸고
- 다시 Task로 넘기고
- SceneDelegate에서 URL 처리까지 겹치면
👉 RunLoop / Task / UI 이벤트 타이밍이 꼬일 확률이 급격히 올라감
3️⃣ “그럼 async/await가 문제인가요?” → ❌ 아님
중요한 포인트야.
❌ async/await 자체가 문제는 아니다
❌ continuation이 나쁜 것도 아니다
✅ “어떤 성격의 비동기인가”가 문제
4️⃣ async/await vs completionHandler 선택 기준 (이게 핵심)
아래 표를 기준으로 판단하면 거의 틀리지 않는다 👇
✅ async/await를 써도 되는 경우
| 조건 | 이유 |
| 네트워크 요청 | 요청–응답 구조가 명확 |
| 디스크 I/O | UI와 분리 가능 |
| DB 접근 | RunLoop 영향 없음 |
| 순수 계산 | UI 이벤트 무관 |
| Firebase Auth 자체 | async API 제공 |
📌 공통점
→ “앱 내부에서 시작해서 앱 내부에서 끝남”
❌ completionHandler가 더 안전한 경우
| 조건 | 이유 |
| 외부 앱 호출 | 앱이 백그라운드로 나감 |
| OAuth + 앱 복귀 | SceneDelegate 개입 |
| UI 흐름이 중요한 SDK | RunLoop 의존 |
| SDK 내부에서 openURL 호출 | 타이밍 제어 불가 |
📌 공통점
→ “앱 밖으로 나갔다가 돌아옴”
카카오, 네이버, 페이스북, 라인 로그인 전부 여기에 해당함.
5️⃣ “카카오 공식 문서엔 왜 안 써있지?”
이건 문서의 한계야.
카카오 공식 문서의 관점
- Swift Concurrency ❌
- 아키텍처 ❌
- 앱 구조 ❌
👉 문서의 목적은 단 하나:
“로그인이 되게 하자”
그래서:
- callback 예제만 제공
- async/await 권장/비권장 언급 없음
- SceneDelegate 주의사항도 최소한만 언급
📌 즉
“어떤 비동기 모델이 안전한지”는 개발자가 판단해야 하는 영역
6️⃣ 그럼 우리는 왜 completionHandler로 가는 게 맞았나?
현재 구조 기준으로 보면:
- 로그인은 앱 외부 이벤트
- SceneDelegate가 개입
- 이후 Firebase 인증까지 연쇄
- AuthState 기반 화면 전환
👉 이 흐름에서 KakaoAuthHandler는
“UI SDK 어댑터” 역할
이런 컴포넌트는 원칙적으로:
- async/await ❌
- continuation ❌
- SDK 원형 유지 ⭕️
지금 네 선택은 아키텍처적으로도 정답이야.
7️⃣ 한 줄로 정리하면
async/await를 쓸 수 있느냐가 아니라
“이 비동기가 앱 내부 작업인가,
외부 앱을 포함한 UI 인증 플로우인가”를 기준으로 판단해야 한다.
8️⃣ 실전 판단 체크리스트 (이거 저장해)
새 SDK 붙일 때마다 이거 체크하면 된다 👇
- 외부 앱 실행됨?
- SceneDelegate / openURL 필요?
- 앱이 background → foreground 오감?
- SDK가 UI 흐름을 직접 제어함?
👉 하나라도 YES면 callback 기반이 안전
'PulseBoard' 카테고리의 다른 글
| 🔐 iOS 네이버 로그인 키 관리 방법 (xcconfig + Info.plist + ClientConfiguration) (0) | 2025.12.30 |
|---|---|
| 🤔 SocialAuthCoordinator 생성 조건 및 구조 설계 (0) | 2025.12.29 |
| 🎫 KakaoAuthHandler 는 왜 async/await를 버리고 completion 기반으로 되돌렸나? (0) | 2025.12.28 |
| Firebase Functions + Kakao 로그인 문제 해결 정리 (0) | 2025.12.27 |
| 🤔 카카오, 네이버 로그인 - accessToken 처리 방향 (1) | 2025.12.26 |