refactor: 코드베이스 정리 및 에러 처리 개선
- API 클라이언트 및 인증 인터셉터 에러 처리 강화 - 의존성 주입 실패 시에도 앱 실행 가능하도록 개선 - 사용하지 않는 레거시 UI 컴포넌트 및 화면 제거 - pubspec.yaml 의존성 업데이트 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -5,10 +5,16 @@ import '../../../../services/auth_service.dart';
|
||||
|
||||
/// 인증 인터셉터
|
||||
class AuthInterceptor extends Interceptor {
|
||||
late final AuthService _authService;
|
||||
AuthService? _authService;
|
||||
|
||||
AuthInterceptor() {
|
||||
_authService = GetIt.instance<AuthService>();
|
||||
AuthService? get authService {
|
||||
try {
|
||||
_authService ??= GetIt.instance<AuthService>();
|
||||
return _authService;
|
||||
} catch (e) {
|
||||
print('Failed to get AuthService in AuthInterceptor: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -23,10 +29,13 @@ class AuthInterceptor extends Interceptor {
|
||||
}
|
||||
|
||||
// 저장된 액세스 토큰 가져오기
|
||||
final accessToken = await _authService.getAccessToken();
|
||||
|
||||
if (accessToken != null) {
|
||||
options.headers['Authorization'] = 'Bearer $accessToken';
|
||||
final service = authService;
|
||||
if (service != null) {
|
||||
final accessToken = await service.getAccessToken();
|
||||
|
||||
if (accessToken != null) {
|
||||
options.headers['Authorization'] = 'Bearer $accessToken';
|
||||
}
|
||||
}
|
||||
|
||||
handler.next(options);
|
||||
@@ -39,36 +48,39 @@ class AuthInterceptor extends Interceptor {
|
||||
) async {
|
||||
// 401 Unauthorized 에러 처리
|
||||
if (err.response?.statusCode == 401) {
|
||||
// 토큰 갱신 시도
|
||||
final refreshResult = await _authService.refreshToken();
|
||||
|
||||
final refreshSuccess = refreshResult.fold(
|
||||
(failure) => false,
|
||||
(tokenResponse) => true,
|
||||
);
|
||||
|
||||
if (refreshSuccess) {
|
||||
// 새로운 토큰으로 원래 요청 재시도
|
||||
try {
|
||||
final newAccessToken = await _authService.getAccessToken();
|
||||
|
||||
if (newAccessToken != null) {
|
||||
err.requestOptions.headers['Authorization'] = 'Bearer $newAccessToken';
|
||||
final service = authService;
|
||||
if (service != null) {
|
||||
// 토큰 갱신 시도
|
||||
final refreshResult = await service.refreshToken();
|
||||
|
||||
final refreshSuccess = refreshResult.fold(
|
||||
(failure) => false,
|
||||
(tokenResponse) => true,
|
||||
);
|
||||
|
||||
if (refreshSuccess) {
|
||||
// 새로운 토큰으로 원래 요청 재시도
|
||||
try {
|
||||
final newAccessToken = await service.getAccessToken();
|
||||
|
||||
final response = await Dio().fetch(err.requestOptions);
|
||||
handler.resolve(response);
|
||||
if (newAccessToken != null) {
|
||||
err.requestOptions.headers['Authorization'] = 'Bearer $newAccessToken';
|
||||
|
||||
final response = await Dio().fetch(err.requestOptions);
|
||||
handler.resolve(response);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
// 재시도 실패
|
||||
handler.next(err);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
// 재시도 실패
|
||||
handler.next(err);
|
||||
return;
|
||||
}
|
||||
|
||||
// 토큰 갱신 실패 시 로그인 화면으로 이동
|
||||
await service.clearSession();
|
||||
// TODO: Navigate to login screen
|
||||
}
|
||||
|
||||
// 토큰 갱신 실패 시 로그인 화면으로 이동
|
||||
await _authService.clearSession();
|
||||
// TODO: Navigate to login screen
|
||||
}
|
||||
|
||||
handler.next(err);
|
||||
|
||||
Reference in New Issue
Block a user