1. 겪었던 문제
메서드마다 interceptor 인스턴스를 넣어주면서 토큰 관련 인증을 알아서 하도록 설정을 해두었는데, 이상하게 토큰 관련 에러가 지속됐다. (토큰이 만료되었습니다.........)
Task {
do {
let response = try await AF.request(AuthRouter.refreshToken(refreshRequest))
.serializingDecodable(AuthTokenResponse.self)
.value
// 새로운 토큰 저장
KeychainHelper.shared.saveAccessToken(response.accessToken)
KeychainHelper.shared.saveRefreshToken(response.refreshToken)
// 재시도
completion(.retry)
} catch {
print("Token refresh failed: \(error)")
completion(.doNotRetry)
}
}
기존 retry 코드인데 지금은 좀 업그레이드 됐지만 토큰 재발급 로직도 제대로 넣어두었다. 클로드의 답변으로는 Task의 비동기 코드 블럭 내에서 completion를 호출하기에 그전에 retry 함수가 이미 끝나고 난 뒤라 적용이 안되는 것 같다고..
하지만 해결되지 않아 튜터님께 도움을 청하고 각 브레이크 포인트를 찍어보았다. (지금까지 혼자할 땐 print로 로그확인을 해왔는데 이젠 진짜 breakpoint도 많이 쓰면서 익숙해질 필요가 있을듯..)
실행 도중에 이 retry 자체에 접근 조차 하지 않는것임..
로그엔 401이라는 상태값을 받는데 웃긴게 data를 print했을 땐 success가 떴음.
여기서 의문점이 생김.. 왜 401인데 성공으로 처리하지?
2. 해결 방법
결국 해당 api 호출 메서드에서 AF.request올리고 serialization을 바로 할 게 아니라 validate()를 우선적으로 해줘야 한다.
해당 메서드를 쓰지 않고선 401도 걸려들어가지 않는듯..
무언가 alamofire 자체에서 401이라는 코드를 받으면 자체 에러 코드로 인식해서 넘겨줄줄 알았는데, 이도 validate라는 함수를 써줘야 성공 여부를 확실하게 지을 수 있나보다.
인터셉터 내부에서 리프레쉬 토큰 마저 만료되었다면 로그인을 띄우도록 NotificationCenter를 이용했는데 이건 다음에 다루도록 하겠다.
알고리즘쪽 오늘부터 건들고 있는데 넘 어려움,,,, 알고리즘 근육 트레이닝 1일차..
'iOS > Swift' 카테고리의 다른 글
[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제) (0) | 2025.03.17 |
---|---|
[TIL / 25.03.13] 의존성 주입 (Dependency Injection) (0) | 2025.03.13 |
[TIL / 25.03.11] 에러 핸들링(Error Handling) (2) | 2025.03.11 |
[TIL / 25.03.05] 이미지 슬라이더 + 커스텀 인디케이터 (2) | 2025.03.05 |
[TIL / 25.02.25] 자료구조, 메모리 구조, ARC에 대해 간략하게! (0) | 2025.02.25 |