ReactNative :

[FN] 마이페이지 회원 정보 가져오기, 로그아웃 / Firebase Database

밍코딩코 2025. 1. 16. 19:49

마이페이지를 개발중인데 Firebase Database에 저장한 사용자의 회원 정보를 가져오도록 구현해보았다.

 

1. 회원 이름 가져오기

 

일단 사용자의 이름을 가져오기 위해 currentUser에 Firebase Authentication에서 현재 로그인된 사용자를 가져온다.

import React, { useState, useEffect } from 'react';
import firestore from "@react-native-firebase/firestore";
import auth from "@react-native-firebase/auth";

const FirstMypageScreen = ({ navigation }: Props) => {
  const [userName, setUserName] = useState<string | null>(null);
  
  useEffect(() => {
  const fetchUserInfo = async () => {
    try {
      const currentUser = auth().currentUser;
  • 사용자의 정보를 가져왔다면
  • userDoc에 Firestore - "users" 컬렉션에 접근
  • 사용자의 uid를 기반으로 문서를 가져온다.
if (currentUser) {
          const userDoc = await firestore()
            .collection("users")
            .doc(currentUser.uid) 
            .get();

 

  • 가져온 정보가 존재한다면
  • 문서 데이터를 JavaScript 객체로 반환한다.
  • 그리고 setUserName에 유저 데이터에 있는 name 필드를 넣는다
  • name 필드가 빈 값일 경우 "알 수 없음"으로 출력
  • [] 빈 배열로 컴포넌트가 처음 화면에 나타날 때 한 번만 실행된다.
if (userDoc.exists) {
          const userData = userDoc.data();
          setUserName(userData?.name || "알 수 없음");
          }
          
          fetchUserInfo();
  }, []);

 

2. 로그아웃

로그아웃은 지난 게시글에서 로그인 관련 함수들을 정의해 둔 authService.js를 불러와서 사용하면 된다.

 

↓ ↓ ↓ ↓ ↓ ↓ authService.js 관련 설명은 ↓ ↓ ↓ ↓ ↓ ↓

[FN] React Native 회원가입 로그인 개발 일지 - Firebase Authentication

 

[FN] React Native 회원가입 로그인 개발 일지 - Firebase Authentication

로그인과 회원가입을 구현하기 위해 Firebase Authentication를 사용하였다.인터페이스는 아직 수정이 많이 필요하고 일단은 기능만 구현하였다. 1. Firebase 프로젝트에서 빌드 - Authentication로 이동하여

codingco.tistory.com

 

handleSignOut에 authService.js에 정의해둔 signOut을 사용하면 된다.

const handleSignOut = async () => {
    try {
      setLoading(true);
      await signOut();
      navigation.replace('Login');
    } catch (error) {
      console.error('로그아웃 실패:', error);
      setLoading(false);
    }
  };

 

홈 화면에 있는 카테고리 버튼들처럼 따로 카테고리 버튼 컴포넌트를 만들고 불러와서 사용하였다.

카테고리 버튼을 클릭했을 때 onCategoryPress를 호출한다.

 

MyPageCategory.tsx 

const MyPageCategory: React.FC<Props> = ({ categories, onCategoryPress }) => {
  return (
    <View style={styles.buttonBox}>
      {categories.map((category) => (
        <TouchableOpacity
          key={category.id}
          style={styles.categoryButton}
          onPress={() => onCategoryPress(category.id)}
        >
          <Image source={category.icon} style={styles.categoryIcon} />
          <Text style={styles.buttonText}>{category.label}</Text>
        </TouchableOpacity>
      ))}
    </View>
  );
};

 

클릭된 카테고리 id에 따른 처리 기능

const handleCategoryPress = (id: number) => {
    const category = categoryButton.find((category) => category.id === id);
    if (category && category.action) {
      category.action(); 
    }
  };

 

다시 FirstMypageScreen에 categoryButton을 정의하고, 로그아웃 카테고리에 위에서 정의한 action: handleSignOut을 통해 정상적으로 로그아웃 기능이 구현된다.

const categoryButton = [
    { id: 1, label: '회원정보수정', icon: require('../images/edit_user_icon.png') },
    { id: 2, label: '비밀번호변경', icon: require('../images/unlock_icon.png') },
    { id: 3, label: '알림설정', icon: require('../images/alarm_icon.png') },
    { id: 4, label: '로그아웃', icon: require('../images/exit_icon.png'), action: handleSignOut },
  ];
<MyPageCategory categories={categoryButton} onCategoryPress={handleCategoryPress} />

 

 

마이페이지 구현 결과

회원 가입에서 입력한 사용자의 이름을 불러옴 / 로그아웃 버튼을 누르면 로그아웃 되면서 다시 처음 로그인 화면으로 전환