From f0b6ab1ae2c471bf25b72fc7e90e9974e9b37d11 Mon Sep 17 00:00:00 2001 From: yongmin01 Date: Fri, 25 Jul 2025 22:40:10 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[Refactor]=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=8C=80=EC=9D=91=20=EB=AA=A8=EB=8B=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84(401=20=EC=97=90=EB=9F=AC=20=EC=A0=9C=EC=99=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/user.js | 33 +++++++++++ src/components/AppLayout.jsx | 9 +++ src/components/modal/APIErrorModal.jsx | 77 ++++++++++++++++++++++++++ src/stores/errorStore.ts | 23 ++++++++ 4 files changed, 142 insertions(+) create mode 100644 src/components/modal/APIErrorModal.jsx create mode 100644 src/stores/errorStore.ts diff --git a/src/apis/user.js b/src/apis/user.js index afe6f27b..2ec767fb 100644 --- a/src/apis/user.js +++ b/src/apis/user.js @@ -1,6 +1,7 @@ import axios from 'axios'; import useLoginStore from '../stores/loginStore'; import qs from 'qs'; +import useErrorStore from '@/stores/errorStore'; axios.defaults.paramsSerializer = (params) => qs.stringify(params, { arrayFormat: 'comma' }); @@ -9,6 +10,26 @@ export const publicAPI = axios.create({ baseURL: import.meta.env.VITE_API_URL, }); +publicAPI.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + if (error.response) { + const errorType = { statusCode: error.response.status, message: error.response.data.error }; + useErrorStore.getState().setError(errorType); + } else if (error.message === 'Network Error' || error.message === 'Network Error') { + console.log('네트워크 에러 발생'); + const errorType = { statusCode: error.message, message: error.message }; + useErrorStore.getState().setError(errorType); + } else { + const errorType = { statusCode: 'Unknown Error', message: '알 수 없는 에러가 발생했습니다.' }; + useErrorStore.getState().setError(errorType); + } + return Promise.reject(error); + }, +); + //인증이 필요한 요청 export const privateAPI = axios.create({ baseURL: import.meta.env.VITE_API_URL, @@ -103,7 +124,19 @@ privateAPI.interceptors.response.use( alert('로그인이 필요한 서비스입니다.'); return 'need login'; } + } else { + const errorType = { + statusCode: error.response.status, + message: error.response.data.error, + }; + useErrorStore.getState().setError(errorType); } + } else if (error.message === 'Network Error' || error.message === 'Network Error') { + const errorType = { statusCode: error.message, message: error.message }; + useErrorStore.getState().setError(errorType); + } else { + const errorType = { statusCode: 'Unknown Error', message: '알 수 없는 에러가 발생했습니다.' }; + useErrorStore.getState().setError(errorType); } return Promise.reject(error); }, diff --git a/src/components/AppLayout.jsx b/src/components/AppLayout.jsx index f997d91c..7ece387d 100644 --- a/src/components/AppLayout.jsx +++ b/src/components/AppLayout.jsx @@ -8,9 +8,13 @@ import Header from './common/Header'; import { Outlet } from 'react-router-dom'; import Footer from './common/footer/Footer'; import LoginModal from './modal/LoginModal'; +import APIErrorModal from './modal/APIErrorModal'; +import ModalWrapper from './modal/ModalWrapper'; +import { useErrorStore } from '../stores/errorStore'; export default function AppLayout() { const { modalOpen } = useLoginModalStore(); + const { hasError } = useErrorStore(); const [isMobile, setIsMobile] = useState(false); @@ -48,6 +52,11 @@ export default function AppLayout() {