본문 바로가기

UIKIT/Firebase

❓ Firebase 로그인 메서드 내 map의 역할

✅ 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:)가 반환하는 타입

➡️ signInAnyPublisher<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))으로 코드 가독성이 향상됨