본문 바로가기
PulseBoard

🤔 async, await VC CompletionHandler 언제 써야하나?(KakaoAuthHandler)

by 밤새는 탐험가89 2025. 12. 28.
728x90
SMALL

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 기반이 안전

 

728x90
LIST