코인잼

코인잼 리팩토링 하기 -3부-

잼굴 2023. 2. 17. 17:13

 

첫 번째

 

useEffect dependency를 추가하였다.

▼ 기존

  useEffect(() => {
    onAuthStateChanged(auth, (userAuth) => {
      if (userAuth) {
        // 유저가 존재하면 login dispatch
        dispatch(
          login({
            email: userAuth.email,
            uid: userAuth.uid,
          })
        )
      } else {
        dispatch(logout())
      }
    })
  }, [])

▼ 변경후

  useEffect(() => {
    onAuthStateChanged(auth, (userAuth) => {
      if (userAuth) {
        // 유저가 존재하면 login dispatch
        dispatch(
          login({
            email: userAuth.email,
            uid: userAuth.uid,
          })
        )
      } else {
        dispatch(logout())
      }
    })
  }, [dispatch])

 

dispatch 함수가 변경될때마다 useEffect를 실행하기위해서 변경하였다.

 

두번째

authStore에서 useSelector 훅을 사용하였다.

이유: 불필요한 렌더링을 줄이기 위해서

import { createSlice } from '@reduxjs/toolkit'
import { useSelector } from 'react-redux'

const authSlice = createSlice({
  name: 'auth',
  initialState: {
    user: null,
  },
  reducers: {
    login: (state, action) => {
      state.user = action.payload
    },
    logout: (state) => {
      state.user = null
    },
  },
})
export const selectUser = (state) => state.auth.user
export const useSelectUser = () => useSelector(selectUser)
export const { login, logout } = authSlice.actions
export default authSlice.reducer

useSelector을 사용하여 Redux 스토어의 상태를 읽을 때, 항상 새로운 객체를 생성하고 상태를 비교하여 새로운 렌더링이 필요한지 여부를 결정한다. 그래서 불필요한 렌더링이 발생하거나 성능에 영향을 줄 수 있다!!

 

내가 만든 useSelectUser 함수는 useSelector을 호출하는 대신 새로운 useSelector 훅을 만들고 selectUser 함수를 전달한다.

이를 통해 selectUser 함수가 변경되지 않으면, useSelector가 반환하는 값이 동일하다는 것을 보장할 수 있고,  불필요한 렌더링을 방지할 수 있다.

 

세번째

CoinDetail 페이지 컴포넌트화

 

'코인잼' 카테고리의 다른 글

코인잼 업데이트 하기 -1부-  (0) 2023.02.20
코인잼 리팩토링 하기 -2부-  (0) 2023.02.15
코인잼 리팩토링 하기 -1부-  (1) 2023.02.13