[gproro-shop-app]리덕스로 로그인 , 회원가입 준비하기

2024. 11. 12. 12:04·⛲ 프로젝트/👖gproro-shop-app

 

❓왜 로그인, 회원가입을 리덕스로 해야하나

  • 앱 전반에서 인증 상태와 사용자 정보를 일관되게 관리할 수 있기 때문

이렇게 store 폴더안에 폴더파일들을 미리 다 만들어준다.

 

1. 스토어 생성

configureStore함수를 이용해서 생성해준다.

store 폴더 바로아래의 index.js에서

import  {configureStore} from "@reduxjs/toolkit";
import { userSlice } from "./user/user.slice";

export const store = configureStore({
    reducer:{
        userSlice
    }
})

 

리듀서를 만들어야하는데 그래서 슬라이스를 하나 만들어보자 

 

1-2. 슬라이스

 

import { createSlice } from "@reduxjs/toolkit";

const initialState = localStorage.getItem("user")
  ? JSON.parse(localStorage.getItem("user"))
  : { email: "", token: "", id: "" };
   // user가 있다면 JSON형식으로 파싱해서 상태설정
export const userSlice = createSlice({
  name: "user",
  initialState,
  reducers: {
    setUser: (state, action) => {
      state.email = action.payload.email;
      state.token = action.payload.token;
      state.id = action.payload.id;

      localStorage.setItem("user", JSON.stringify(state));
    },
    removeUser: (state) => {
      state.email = "";
      state.token = "";
      state.id = "";
      localStorage.setItem("user", JSON.stringify(state));
    },
  },
});
export const { setUser, removeUser } = userSlice.actions;
export default userSlice.reducer;

 

❓action.payload는 뭐지

  • action.payload는 Redux에서 액션이 전달하는 데이터를 의미한다. 
  •  action.payload는 dispatch할 때 넘겨받은 데이터이다.

예를 들어, dispatch(setUsers({ email: "example@example.com", token: "abcd1234", id: "user123" }))라고 호출하면,

{ email: "example@example.com", token: "abcd1234", id: "user123" }가 action.payload로 전달된다.

 

❓ 슬라이스와 리듀서는 무엇

  • 슬라이스: Redux에서 특정 기능에 관한 상태와 그 상태를 업데이트하는 리듀서를 하나로 묶은 것입니다. createSlice로 만들 수 있고, 이 안에 초기 상태, 리듀서 함수, 액션을 정의합니다. 슬라이스는 큰 상태를 여러 조각으로 나누어 관리할 수 있게 해준다.
  • 리듀서: 상태를 변경하는 함수 액션을 받아서 그에 따라 새로운 상태를 반환합니다. 리듀서는 순수 함수여야 하며, 주어진 state와 action에 따라 상태를 변경하는 규칙을 정의합니다. createSlice 안에 정의된 함수들이 리듀서라고 볼 수 있다.

그래서 마저 store를 만들어준 다음에 프로바이더로 감싸줘야한다.

2. 프로바이더

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import '../src/global.scss'
import { Provider } from 'react-redux'
import { store } from './store/index.js'

ReactDOM.createRoot(document.getElementById('root')).render(
  <Provider store={store}>
    <App />
  </Provider>,
)

 

Provider 사용하려면 npm install react-redux를 설치해준다.

생성한 스토어도 넣어준다.

 

 

3. SignIn Component

import React, { useState } from 'react'
import Form from '../../../components/form/Form'
import { useNavigate } from 'react-router-dom'
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
import app from '../../../firebase';
import { useDispatch } from 'react-redux';
import { setUser } from '../../../store/user/user.slice';

const SignIn = () => {
  const navigate = useNavigate();
  const[firebaseError,setFirebaseError]= useState("");
 
  const auth = getAuth(app);
  const dispatch = useDispatch();
    //💥dispatch를 가져온다.
 
  const handleLogin = (email,password) =>{
    signInWithEmailAndPassword(auth,email,password)
      // 💥 handleLogin함수는 email과 password를 받아 firebase의 signinwithemailandpassword로 인증을 시도함
    .then(userCredential =>{
        //리덕스 스토어에 담는 로직
      dispatch(setUser({
        email:userCredential.user.email,
        token:userCredential.user.refreshToken,
        id: userCredential.user.uid,\
       //💥성공시 userCredential로부터 로그인된 사용자정보자겨와 setUser에 전달하고 redux 상태저장
      }))
      navigate('/')
    })
    .catch(error =>{
        return error && setFirebaseError("이메일 비번 잘못됨");
      })
    }

  return (
   <Form title={"로그인"}
  getDataForm={handleLogin}
  firebaseError={firebaseError}/>
  )
}

export default SignIn;

 

 

4.SignUp Component

import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import Form from '../../../components/form/Form';
import { createUserWithEmailAndPassword, getAuth } from 'firebase/auth';
import app from '../../../firebase';
import { useDispatch } from 'react-redux';
import { setUser } from '../../../store/user/user.slice';

const SignUp = () => {
  const navigate = useNavigate();
  const [firebaseError, setFirebaseError] = useState("");
 
  const auth = getAuth(app);
  const dispatch = useDispatch();

  const handleSignupAndLogin = (email, password) => {
    createUserWithEmailAndPassword(auth, email, password)
      .then((userCredential) => {
        dispatch(setUser({
          email:userCredential.user.email,
          token:userCredential.user.refreshToken,
          id: userCredential.user.uid
        }))
       
        navigate('/');
      })
      .catch(error => {
        console.log(error);
        return error && setFirebaseError("이메일 또는 비밀번호가 잘못되었습니다.");
      })
  }

  return (
    <Form
      title={"가입하기"}
      getDataForm={handleSignupAndLogin}
      firebaseError={firebaseError}
    />
  );
};

export default SignUp;

 

 

 

이렇게하면 리덕스 스토어 에 유저 정보가 잘 들어온것을 확인할 수 있다.

'⛲ 프로젝트 > 👖gproro-shop-app' 카테고리의 다른 글

[ gproro-shop-app] 로그인여부로 분기처리 with redux  (0) 2024.11.14
[gproro-shop-app] 장바구니 기능 with Redux  (0) 2024.11.14
[gproro-shop-app] 카테고리별 데이터 가져오기 + 스켈레톤 UI  (0) 2024.11.12
[gproro-shop-app] product 데이터가져오기 with Redux thunk  (0) 2024.11.12
[gproro-shop-app] category 컴포넌트 구현 with Redux  (1) 2024.11.12
'⛲ 프로젝트/👖gproro-shop-app' 카테고리의 다른 글
  • [gproro-shop-app] 장바구니 기능 with Redux
  • [gproro-shop-app] 카테고리별 데이터 가져오기 + 스켈레톤 UI
  • [gproro-shop-app] product 데이터가져오기 with Redux thunk
  • [gproro-shop-app] category 컴포넌트 구현 with Redux
gprorogpfus
gprorogpfus
:- >
  • gprorogpfus
    gpfusdldks
    gprorogpfus
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • 🎭JavaScript (2)
      • 👚 CSS (1)
      • ⚛️ React (13)
      • 🌃 Next.js (6)
        • 🔜 next.js-study (3)
      • 🥏TypeScript (10)
      • 🏴알고리즘 (2)
      • 🌴트러블슈팅 (3)
      • ⛲ 프로젝트 (6)
        • 👖gproro-shop-app (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    react
    Redux
    TypeScript
    JavaScript
    GIT
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gprorogpfus
[gproro-shop-app]리덕스로 로그인 , 회원가입 준비하기
상단으로

티스토리툴바