서버와 통신할 때, 데이터 모델을 직렬화하기 위해 쓰인다.
class DataModel {
final String title, nick, content;
DataModel.fromJson(Map<String, dynamic> json)
: title = json['title'],
about = json['nick'],
genre = json['content'];
}
이런 식으로 작성하여 직렬화를 한다.
flutter 패키지 중에 이런 작업을 자동화해주는 패키지가 있다.
import 'package:json_annotation/json_annotation.dart';
part 'data_model.g.dart';
()
class DataModel {
final String title, nick, content;
DataModel({
required this.title,
required this.nick,
required this.content,
});
factory DataModel.fromJson(Map<String, dynamic> json) => _$DataModelFromJson(json);
Map<String, dynamic> toJson() => _$DataModelToJson(this);
}
어노테이션으로 @JsonSeriallizable()를 클래스 위에 작성하고 저장하면
패키지가 알아서 date_model.g.dart 파일을 생성하고 직렬화 코드를 작성해준다.
서버와 통신할 때 작성하는 코드 부분을 자동으로 생성해주는 역할을 해준다.
part 'free_repository.g.dart';
final freeRepositoryProvider = Provider((ref) {
final url = '$baseUrl/board/free'; // 통신할 주소
final dio = ref.watch(dioProvider); // dio provider
final repository = FreeRepository(dio, baseUrl: url);
return repository;
});
()
abstract class FreeRepository {
factory FreeRepository(Dio dio, {String baseUrl}) = _FreeRepository;
// 전체 게시글 가져오기
('/')
Future<FreeListModel> getLists({('page') required int page});
// ...
}
추상화 클래스 위에 @RestApi()를 작성하면, 패키지가 통신에 필요한 코드를 작성하여 새로 파일을 생성한다.
Dio 패키지는 서버와 통신할 때 쓰는 패키지인데, 유용한 기능인 Interceptor가 있다.
뜻 그대로, 가로채는 것인데 요청 보내기 전, 요청 받기 전, 에러 받기 전에 어떤 작업을 할지 작성해 줄 수가 있다.
void onRequest(
RequestOptions options, RequestInterceptorHandler handler) async {
if (options.headers['accessToken'] == 'true') {
options.headers.remove('accessToken');
final token = await storage.read(key: ACCESS_KEY);
options.headers.addAll({'Authorization': token});
}
return super.onRequest(options, handler);
}
다른 파일에서 서버와 통신하는 코드에서 헤더에 accessToken: true를 넣어서 보내면
Dio에서 서버로 보내기 전에, 헤더에 유저의 AccessToken으로 바꾼 후, 서버로 요청하게 된다.
로그 기록이나, 토큰이 만료됐을 경우, 리프레시 토큰을 이용하여 갱신하는 등의 작업이 가능할 것 같다.