✅ map(\.user)의 역할
func loginUser(with email: String, password: String) -> AnyPublisher<User, Error> {
return Auth.auth().signIn(withEmail: email, password: password)
.map(\.user) // ✅ 여기서 map이 동작
.eraseToAnyPublisher()
}
🔹 Firebase의 signIn(withEmail:password:)가 반환하는 타입
➡️ signIn은 AnyPublisher<AuthDataResult, Error>를 반환해.
➡️ 즉, AuthDataResult라는 객체가 반환되는데, 우리는 여기서 User 객체만 필요해.
func signIn(withEmail email: String,
password: String) -> AnyPublisher<AuthDataResult, Error>
📌 Parameters (매개변수)
- email
- 사용자의 이메일 주소.
- password
- 사용자의 비밀번호.
📌 Return Value (반환 값)
- 로그인 과정의 결과(AuthDataResult)를 방출하는 Publisher를 반환함.
- 이 Publisher는 메인 스레드(Main Thread)에서 실행됨.
📌 Discussion (설명)
- 이 Publisher는 이벤트를 메인 스레드에서 방출함.
- 즉, signIn을 호출하면 비동기적으로 실행되지만, 최종적으로 받은 결과(AuthDataResult 또는 Error)는 메인 스레드에서 처리됨.
✅ 결론: map(\.user)는 AuthDataResult에서 user를 추출
Auth.auth().signIn(withEmail: email, password: password)
.map(\.user)
1. signIn의 결과: AuthDataResult
- 원래 signIn이 반환하는 값은 AuthDataResult 타입의 Publisher
2. map(\.user)가 하는 일
- AuthDataResult 안에서 user 속성만 추출
- 결과적으로 AnyPublisher<User, Error> 형태로 변환
🚀 비교: map이 없으면?
만약 map(\.user)을 사용하지 않는다면 다음과 같이 해야 함:
func loginUser(with email: String, password: String) -> AnyPublisher<User, Error> {
return Auth.auth().signIn(withEmail: email, password: password)
.map { authResult in
return authResult.user
}
.eraseToAnyPublisher()
}
✔️ 위 코드와 map(\.user)는 동일한 역할을 함!
✔️ Swift의 KeyPath 문법 (\.)을 활용하여 map(\.user)처럼 더 간결하게 표현 가능
🎯 정리
✅ map(\.user)는 Firebase의 AuthDataResult에서 User 객체를 추출하는 역할
✅ signIn이 반환하는 값이 AuthDataResult이므로, map(\.user)을 사용하면 User만 추출할 수 있음
✅ 결과적으로 AnyPublisher<User, Error> 타입으로 변환됨
✅ KeyPath를 활용한 간결한 표현 (map(\.user))으로 코드 가독성이 향상됨
'UIKIT > Firebase' 카테고리의 다른 글
📍 Firebase 의 Storage 에 사진 업로드하는 방법 (1) | 2025.02.28 |
---|---|
❓ FireStore 내에 회원정보를 불러오는 데 왜 tryMap? (0) | 2025.02.27 |
🚀 Future를 사용한 방식 vs map(\.user)을 사용한 방식의 차이점 (Future 는 필수인가?) (0) | 2025.02.26 |
🔥 MVVM + Combine을 활용한 소셜 로그인 & 이메일 회원가입 (0) | 2025.02.26 |
🤔 소셜 미디어 로그인 방법에서 Future를 사용한 이유? (0) | 2025.02.26 |