휴면 계정 복구시키기

dudgus5766·2023년 1월 16일
0

Junior Developer

목록 보기
13/18

Baund 앱 출시를 한지 거의 1년이 다 되어갑니다.... (벌써 1년이라니..) 감회가 새롭다 생각할 새도 없이 휴면 계정 처리에 대한 문제가 대두됐습니다👤
로그인 로직에 휴면 계정 복구 처리 단계를 추가하고, axios.interceptors 로 휴면 계정 에러를 처리했습니다.

📍axios.interceptors

axios.interceptorsthen 이나 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);
  }
);

error interceptor

위 예제처럼 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);
    }
profile
RN App Developer

0개의 댓글