강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

별다방님의 프로필 이미지
별다방

작성한 질문수

코드로 배우는 React 19 with 스프링부트 API서버

로그인 관련 커스텀 훅 만들기

로그인 관련 커스텀 훅 만들기 -> 부분 질문입니다.

작성

·

61

·

수정됨

0

현재 loginSlice.tsx에서 오류가 나고 있습니다..

아래와 같은 메세지를 접했습니다.

useCustomLogin.tsx:2 Uncaught SyntaxError: The requested module '/src/store.tsx' does not provide an export named 'AppDispatch' (at useCustomLogin.tsx:2:10) 

 

어느부분을 손 봐야할까요?
vite 6.3버전으로 이용하고 있습니다.

 

loginSlice.tsx

import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"
import { loginPost } from "../api/memberApi"
import { removeCookie, setCookie } from "../util/cookieUtil"

export interface LoginInfo {
   email:string,
   nickname:string,
   accessToken: string, 
   refreshToken: string,
   roleNames: string[],
   status: string
}

const initState:LoginInfo = {
   email: '',
   nickname: '',
   accessToken:'',
   refreshToken: '',
   roleNames: [],
   status: ''
}

export const loginPostAsync = createAsyncThunk('loginPostAsync', ({email, pw}: {email:string, pw:string}) => {
    console.log("---------------loginPostAsync---------------------")
    console.log(email, pw)
    return loginPost(email, pw)
})
  
  



const loginSlice = createSlice({
  name: 'loginSlice',
  initialState: initState,
  reducers: {

    save: (state, action) => {

      console.log("save...........")

      return action.payload

    },
    
    logout: (state, action) => {

      console.log("logout..........")

      removeCookie("member")
    }
  },
  extraReducers :(builder) => {
    builder.addCase(loginPostAsync.fulfilled , (state, action) => {

      console.log("loginPostAsync.fulfilled")

      const newState:LoginInfo = action.payload

      newState.status = 'fulfilled'

      setCookie("member", JSON.stringify(newState), 1) 

      return newState

    })
    .addCase(loginPostAsync.pending, (state, action) => {
      console.log("loginPostAsync.pending")
      state.status = 'pending'
    })

    .addCase(loginPostAsync.rejected, (state, action) => {
      console.log("loginPostAsync.rejected")
      state.status = 'rejected'
    })

  }
})

export const { save, logout} = loginSlice.actions

export default loginSlice.reducer

  

 

useCustoLogin.tsx

import { useDispatch, useSelector } from "react-redux"
import { AppDispatch, RootState } from "../store"
import { Navigate, useNavigate } from "react-router"
import { loginPostAsync, logout, save } from "../slices/loginSlice"
import { useEffect } from "react"
import { getCookie } from "../util/cookieUtil"


const useCustomLogin = () => {

  const dispatch = useDispatch<AppDispatch>()
  //로그인 상태 객체 
  const loginState = useSelector((state: RootState) => state.loginSlice)
 
  //로그인 여부 
  const loginStatus = loginState.status //fulfilled, pending, rejected

  useEffect(()=> {

    if(! loginStatus ) {

      const cookieData = getCookie("member")

      if(cookieData){
        dispatch(save(cookieData))
      }

    }

  }, [])

 
  const navigate = useNavigate()
 
  const doLogin = async (email:string, pw:string) => {
    dispatch(loginPostAsync({ email, pw }))
  }

  const doLogout = () => {
    dispatch(logout(null))
  }
  const moveToLogin = () => {
    navigate("/member/login")
  }
  const moveToLoginReturn = () => { //--------로그인 페이지로 이동 컴포넌트 
    return <Navigate replace to="/member/login"/>
  }
     
  const moveToPath = (path:string) => { //----------------페이지 이동 
    navigate({pathname: path}, {replace:true})
  }
    

  return {loginState, loginStatus, doLogin, doLogout,moveToLogin,moveToLoginReturn,moveToPath}

}

export default useCustomLogin

 

 

store.tsx

import { configureStore } from "@reduxjs/toolkit";
import loginSlice from "./slices/loginSlice";

const store = configureStore({
  reducer: {
    "loginSlice": loginSlice,
  }
})

export type AppDispatch = typeof store.dispatch

export type RootState = ReturnType<typeof store.getState>

export default store

답변 2

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

올려주는 코드를 강의에 사용한 코드에 적용했을때 특별히 에러가 발생하지는 않았습니다.

해당 부분은 AppDispatch 에 대한 import 문제라고 나오는데 문제가 있지는 않네요..

우선 제공되는 코드를 한번 이용해 보시는게 어떨까 싶습니다.

 

해당 섹션에 추가되어 있는 소스코드역시 6.3으로 제작되어 있습니다. 강의 자료에 있으니 사용해 보시길 바랍니다.

 

혹시 문제 해결이 안되시면 개인 깃헙 주소를 메일(cookie_00@naver.com)으로 보내주시면 살펴볼 수 있습니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. 별다방님.

로그인 관련 커스텀 훅에서 발생한 오류는 주로 useCustomLogin.tsxstore.tsx에서 제대로 내보내지 않는 것을 가져오려 했을 때 발생할 수 있습니다.

문제 해결:

  1. 모듈 내보내기 확인: store.tsx 파일에서 AppDispatchRootState가 제대로 내보내지고 있는지 확인해 봅시다. 보통 ES6 모듈 시스템에서는 export 키워드를 사용해 내보내기를 정의합니다.

  2. 내보내기 명확히 하기: store.tsx에서 AppDispatch, RootState의 타입을 명시적으로 내보내야 import 기능이 정상 작동할 수 있습니다. 다행히 코드에서는 정확히 export type AppDispatch = typeof store.dispatchexport type RootState = ReturnType<typeof store.getState> 라고 명시되어 있습니다.

  3. Vite 버전 및 설정 확인: 사용 중인 Vite의 버전이 영향을 줄 수 있습니다. 최신 Vite 버전에서는 ES 모듈 시스템을 사용하므로, store.tsx 파일의 내보내기가 ES 모듈 방식으로 되어있는지 확인이 필요합니다.

  4. 캐시 및 빌드 데이터 삭제: Vite가 빌드된 데이터를 캐시하여 문제를 일으킬 수도 있습니다. npm run clean 또는 npm cache clean --force를 사용해 캐시를 정리하고 프로젝트를 다시 빌드해 보세요.

추가 지원 리소스

이 오류와 관련된 내용은 비슷한 주제를 다루는 기존 질문 URL을 참조하실 수 있습니다:
- React에서 타입스크립트로 Redux의 상태와 Dispatch 타입 정하기

위의 해결 방안들이 도움이 되길 바라며, 만약 이 방법으로 문제가 해결되지 않거나 추가적인 도움이 필요하신 경우, 더 상세한 설명을 덧붙여 주시면 감사하겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

별다방님의 프로필 이미지
별다방

작성한 질문수

질문하기