Baund 앱 출시를 한지 거의 1년이 다 되어갑니다.... (벌써 1년이라니..) 감회가 새롭다 생각할 새도 없이 휴면 계정 처리에 대한 문제가 대두됐습니다👤
로그인 로직에 휴면 계정 복구 처리 단계를 추가하고,axios.interceptors
로 휴면 계정 에러를 처리했습니다.
axios.interceptors
는 then
이나 catch
로 처리되기 전에 request, response를 감지해서(가로채서) 어떤 작업을 할 수 있도록 해주는 함수입니다.
// API 호출 전 해당 함수가 먼저 실행됩니다.
axios.interceptors.request.use(
(config) => {
return config;
},
(error) => {
return Promise.reject(error);
}
);
// API 실행 후 response를 감지하여 데이터를 return 합니다.
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
return Promise.reject(error);
}
);
위 예제처럼 interceptors.response
를 통하여 에러를 감지할 수 있게 됩니다. error response에서 보내는 error code
에 따라 다른 에러 처리를 가능하게 됩니다.(401, 610 등의 에러 코드에 대한 에러 처리를 위해서 별도로 errorController 생성)
// 응답 interceptor
api.interceptors.response.use(
(response) => response,
(error) => {
// response가 error일 경우
const { status, message } = error.response;
const originalRequest = error.config;
// 에러코드가 401일 경우
if (status === 401) {
...중략
401 에러 처리를 예를 들어서 조금 자세히 설명하면, AccessToken이 만료되었는지 확인하고, refreshToken을 가지고 token refresh를 시켜주는 로직을 구현할 수 있습니다.
// 응답 interceptor
api.interceptors.response.use(
(response) => response,
(error) => {
// response가 error일 경우
const { status, message } = error.response;
const originalRequest = error.config;
// 에러코드가 401일 경우
if (status === 401) {
if (!originalRequest.refreshTokenRetry) {
const { auth } = store.getState();
// expire token 검사
if (!auth.token?.refreshToken) {
// 로그아웃 처리
...중략
return Promise.reject(error);
}
// refreshToken으로 token 갱신 요청
return dispatch(refreshToken(auth.token.refreshToken))
.then(() => {
// 다시 발급받은 accessToken으로 로그인 시도
...중략
그럼 이제 response를 사용해 서버에서 오는 에러 코드 처리를 작성합니다. 휴면 계정에 대한 에러코드는 640으로 보내주었습니다. 640 에러코드를 받은 경우 로그아웃 로직을 거쳐 로그인 화면으로 돌아갑니다.
// 휴면계정 관련 오류가 있을 경우(640)
if (status === 640) {
dispatch(logout());
return Promise.reject(error);
}