flutter / JSON Serialization, Retrofit

rO_Or·2024년 5월 6일

Dart 그리고 Flutter

목록 보기
14/19

Json Serialization

서버와 통신할 때, 데이터 모델을 직렬화하기 위해 쓰인다.

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 파일을 생성하고 직렬화 코드를 작성해준다.

Retrofit

서버와 통신할 때 작성하는 코드 부분을 자동으로 생성해주는 역할을 해준다.

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

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으로 바꾼 후, 서버로 요청하게 된다.

로그 기록이나, 토큰이 만료됐을 경우, 리프레시 토큰을 이용하여 갱신하는 등의 작업이 가능할 것 같다.

profile
즐거워지고 싶다.

0개의 댓글