On a couch
[메인프로젝트] Axios Interceptor로 로그인 리팩토링 (진행 중) 본문
상황
프로젝트를 하는 내내 머리를 감싸쥐게 했던 것이 바로 axios와 jwt 토큰이 메인인 로그인 기능이었다.
이 기능들을 기본 함수와 커스텀 훅을 이용해 구현했는데, 이걸 axios interceptor로 리팩토링하려고 한다.
프로젝트를 진행할 당시에도 interceptor의 존재를 알았지만 안 썼던 이유는 간단하다.
프리 프로젝트를 할 때 직접 할 수 있는 일을 라이브러리를 도입해서 쓰려다가 오히려 더 복잡해진 경험이 있어서,
할 수 있어 보이는 일에 굳이 라이브러리를 쓰고 싶지 않아서였다.
보통 interceptor를 사용하는 이유를 찾으면 주로 이런 것이 나온다.
1) api 호출할 때마다 비효율적으로 axios 인스턴스를 생성
2) axios 마다 동일한 content-type , token와 같은 헤더값 처리
3) axios TIMEOUT 시간, base url 등에 대한 중복 처리
그런데 내 생각은 이랬다.
1) interceptor 써도 호출문 import해 오고 주소 작성해서 body나 parameter 전달하는 거 똑같아 보이던데..
다른 파일에 코드를 작성해두고 import로 가져오는 방식이라면 굳이 라이브러리를 쓰지 않아도 할 수 있다.
실제로 TokenAuth.js라는 파일을 만들고 관련 함수들을 만들어서 몰아두고 썼다.
2) 토큰 받아오자마자 default 로 만들면 되는데 다른 변수에 저장했다가 다시 config 할 필요가 뭐가 있는가..?
axios.defaults.headers.common['Authorization'] = response.data.accessToken
3) base url도 마찬가지로 한 번 설정해 놓으면 다시 적을 필요가 없다.
axios.defaults.baseURL = process.env.REACT_APP_API_URL
그러다가 이런저런 경우에서 에러가 나는 것을 잡으러 다니면서 '그거 썼으면 지금쯤 훨씬 편했으려나..' 하는 생각이 들었다.
(access / refresh 시간 설정해두고 만료 되는 상황을 관찰하는 게 끝도 없는 잠복근무 같았다)
그래서 프로젝트 끝나면 '그거' 한 번 꼭 써 보리라 하고 계속 마음속에 담아두고 있었다.
목표하는 것
사용을 위해 다시 검색해보다가, 아래 두 링크를 보고 '이런 방법이라면 리팩토링하는 의미가 있겠다' 싶어서
이 방법들을 적용하고자 한다.
1. API파일 작성
앞에 적은 '내 생각' 1번에 대한 답이 될 수 있겠다. 정말로 axios 요청을 보내는 곳의 코드가 눈에 보이게 깔끔하려면 주소와 전달값도 안 보여야지, 하는 생각.
+ 글 하단에 적힌 다른 활용법들도 좋아 보였다. 특히 로딩 인디케이터는 또다른 리팩토링 목표이기도 하다.
- 로그인 전후 분기 처리해서 헤더 넣어주기
- 모든 요청에 로딩 인디케이터 삽입하기
- 응답 에러 발생시, 알림 팝업 만들기
2. 직방 기술 블로그에 소개된 'axios 실패 시 재시도' 방법에 관한 글이다.
AxiosRequestConfig를 재시도 횟수를 저장할 저장공간으로 활용하는 방식도 좋았다.
글에 오류가 있거나 조언이 있으시다면 댓글 남겨주시면 감사하겠습니다 :)
'코드스테이츠 FE > 프로젝트' 카테고리의 다른 글
[메인 프로젝트] 개인적 회고 (0) | 2022.10.13 |
---|---|
[메인 프로젝트] 로그인 기능 드디어 완성 (0) | 2022.10.05 |
[메인프로젝트] 커스텀 훅 컴포넌트에 넣기 (0) | 2022.10.01 |
[메인 프로젝트] 토큰 검증 커스텀훅 / invalid hook call 에러 (0) | 2022.09.28 |
[메인프로젝트] 랜딩페이지 애니메이션 (0) | 2022.09.27 |