공간감 앱을 만들면서 네트워크 모듈을 만들어서 사용할지, Alamofire나 Moya를 사용할 지에 대해서 팀원들과 토의를 했습니다.
이전에 네트워크 모듈을 직접 만들어서 사용한 경험이 있어서 써드파티의 필요성을 잘 느끼지 못했습니다.
다만 이번 서비스에서 jwt로 인증을 구현하여서 토큰 관리에 대한 필요성이 생겼습니다.
Alamofire에서는 토큰 관리를 어떻게 하는지에 대해서 알아보았고, RequestInterceptor를 사용한다는 것을 알게 되었습니다.
RequestInterceptor는 말 그대로 Request를 중도에 빼았는 아이인데요,
/// request를 보내기 전 처리를 해주는 메소드
func adapt(_ urlRequest: URLRequest, for session: Alamofire.Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
/// 오류가 있을 경우 retry를 해주는 메소드
func retry(_ request: Request, for session: Alamofire.Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)
RequestInterceptor 프로토콜을 채택해서 adapt와 retry를 구현해주는 로직이었습니다.
그러면 공간감에서 Interceptor를 어떻게 구현했는지 보겠습니다.
adapt라는 메소드를 가지는 RequestAdapter 프로토콜과 retry라는 메소드를 가지는 RequestRetrier가 있습니다.
그리고 위의 두 프로토콜을 합친 RequestInterceptor라는 프로토콜을 만들어 주었습니다.
request와 error를 각각 bypass하는 기본 함수를 extension으로 구현해줌으로써 구현부에서 adapt와 retry를 구현하지 않고 불렀을 때를 대비해주었습니다.
이번에는 interceptor를 어떻게 로직에 녹였는지를 보겠습니다.
request 메소드는 request에 필요한 정보를 모두 담고 있는 endpoint를 받아서 URLRequest로 변환해서 결과를 전달해주는 메소드입니다.
여기서 만약 interceptor가 파라미터로 들어오게 된다면 request 전에 adapt 메소드를 실행시킨 결과를 요청하게 됩니다.
요청을 보내고 난 후 결과를 받아오면, statusCode를 확인해서 200번대라면 그대로 진행을 하고, 200번대가 아니라면 invalidStatusCode(Int) 에러를 던져주어서 statusCode를 확인할 수 있도록 했습니다.
retry가 사용되는 부분은 catch 부분인데요, 만약 error가 검출되고 interceptor가 파라미터로 전달이 되었다면 retry를 실행하게 됩니다.
그러면 이제 RequestInterceptor 프로토콜을 채택해서 실제로 구현한 클래스를 확인해보겠습니다.
키체인에서 accessToken과 refreshToken에 접근할 수 있는 KeyChainManager를 주입받은 GGGInterceptor는 accessToken과 refreshToken에 접근을 할 수 있도록 했습니다.
adapt 메소드는 위의 accessToken을 request의 헤더에 삽입을 해주고 다시 반환해주도록 구현했습니다.
retry 메소드는 전달받은 error의 statusCode가 401이라면 refreshToken을 통해 accessToken을 재발급받고, 다시 같은 요청을 보내게 됩니다.
만약 error가 401이 아니라면, 전달받은 error를 bypass 시킵니다.
위와같이 구현을 함으로써 Alamofire에서 토큰을 간편하게 관리할 수 있는 RequestInterceptor의 로직에 대해서 자세하게 알아볼 수 있었습니다 :)
전체 코드를 보고싶으신 분들은 아래 깃허브 링크를 참고해주세요.
https://github.com/GongGanGam/GongGanGam-iOS
'🍎 iOS > 📱 iOS' 카테고리의 다른 글
BDD로 테스트하기(feat. Quick) (2) | 2023.10.29 |
---|---|
Queenfisher 이미지 캐시 개선기 (0) | 2022.12.30 |
MVVM-C + Clean Architecture 도입기 (0) | 2022.12.14 |