티스토리 뷰

반응형

[1] 문서보기 

한글문서: flutter-ko.dev/docs/development/data-and-backend/json

영어문서: flutter.dev/docs/development/data-and-backend/json 

 

1) serialization 용어 정리 

 

우선 serialization에 대한 용어정리부터 시작합니다.

 

Encodingserialization는 같은 것입니다. 데이터구조(data structure)를 string으로 바꿉니다.

이와 반대되는 개념으로 Decodingdeserialization이 있습니다. string을 데이터구조로 바꿉니다. 

 

하지만, serialization(직렬화)는 일반적으로 데이터 구조를 읽기 쉬운 형태로 변환하는 과정을 가리키기도 합니다.

혼란을 피하기 위해, 이 문서에서는 전반적인 과정을 언급할 때 “직렬화”라 하고,

구체적으로 각각의 과정들을 언급할 때 “인코딩”과 “디코딩”이라 합니다.

 

2) JSON을 다루는 두가지 방법

 

문서에서는 JSON을 다루는 두가지 방법을 소개합니다. 

 

  • 일반 직렬화 (Manual serailization) 
  • 코드 생성을 이용한 자동화된 직렬화 (Automated serialization using code generation)

일반 직렬화는 소규모프로젝트,

코드 생성을 이용한 자동화된 직렬화는 중대형 프로젝트에서 쓰면 좋다고 합니다. 

 

2.1 ) 일반 직렬화

일반 JSON 디코딩은 dart:convert에 탑재되어 있는 JSON 디코더를 사용하는 것을 가리킵니다.

JSON 문자열을 jsonDecode() 함수에 전달한 후 결괏값 Map<String, dynamic>에서 필요한 값을 참조하면 됩니다.

 

추가적인 의존성이나 특별한 설치 과정이 없어서 빠르게 쓸 수 있습니다. 

하지만 이러한 방법은 프로젝트가 커지게되면 적합하지 않습니다.

디코딩 로직을 손수 작성하면, 관리하기 어려워질 수 있고 오류 발생 가능성이 커질 수 있습니다.

만약 존재하지 않는 JSON 필드에 접근하는 실수를 한다면, 코드가 런타임 도중에 에러가 발생 할 수도 있습니다.

 

프로젝트에 JSON 모델이 많이 없고 개념을 빠르게 검증해 보고 싶다면, 일반 직렬화가 시작하기 적합한 방법입니다.

예제는 dart:convert를 이용해 수동으로 JSON을 직렬화하기 를 보면 됩니다.

 

 

2.2 ) 코드 생성을 이용한 자동화된 직렬화

 

코드 생성을 이용한 JSON 직렬화는 외부 라이브러리를 통해 인코딩 보일러 플레이트 코드를 생성하는 것을 의미합니다.

초기 작업 후, 모델 클래스로부터 코드를 생성해주는 파일 감시자를 실행합니다.

예를 들어, json_serializable와 built_value가 대표적인 라이브러리입니다.

 

이 방법은 초기작업이 필요하므로 소규모 프로젝트에 적합하지 않을 수 있지만, 큰 프로젝트에 대해 잘 대응합니다.

손수 작성한 보일러 플레이트 코드가 필요하지 않고, JSON 필드에 접근할 때 발생하는 실수를 컴파일 타임에 잡아냅니다.

 

예제는 코드 생성 라이브러리를 통한 JSON 직렬화. 를 보면 됩니다. 

 

==> 저는 소규모 프로젝트니까 일반직렬화를 사용할게요!! 코드생성을 통한 자동화된 직렬화는 문서를 참고해주세요

 

[2] 문서보기 > Serializing JSON inside model classes

 

우선 간단한 JSON 인코더와 디코더가 내장된 dart:convert 패키지를 import 해주세요

 

User모델 클래스를 만들어주고 아래 두개를 넣어줄게요-!

 

  • map 구조에서 새로운 User 객체를 생성하기 위한 생성자인 User.fromJson() 생성자
  • User 객체를 map 구조로 변환하기 위한 메서드인 toJson() 메서드

 

User를 디코딩하기 - jsonDecode

 

디코딩 로직의 책임이 이제 모델 내부로 옮겨졌기에,

밖에서는(서비스쪽에서는) 유저를 쉽게 디코드할 수 있습니다.

 

 

User를 인코딩하기 - jsonEncode

 

유저를 인코딩하기 위해서는 jsonEncode() 함수에 User 객체를 넘겨줍니다.

인코딩을 toJson() 메서드 대신 jsonEncode()가 해주므로, toJson() 메서드를 호출할 필요는 없습니다.

 

 

[3] 실전 예제

 

3.1 기존 User모델과 User서비스 

 

예전에는 User모델에 디코딩로직이 없어서

 

 

User서비스에서 디코딩을 해줬습니다.

 

 

3.2 fromJSON을 쓰도록 리팩토링

 

User모델에 디코딩로직을 넣으니까

 

 

서비스에서 디코딩 중복로직도 지워지고 깔끔해졌습니다. ☺️

 

 

반응형
댓글