내배캠 29일차_ Flutter 실무숙련(JSON MVVM)
1. Flutter 실무숙련
[데이터 통신 기초와 JSON]
직렬화 (Serialization) : 객체 -> JSON 문자열, 앱에서 서버로 데이터를 전송할 때 많이 사용.
jsonEncode(object.toJson())
역직렬화 (Deserializtion) : JSON 문자열 -> 객체, 서버에서 받은 JSON 데이터를 앱에서 객체로 사용하기 위해 필요.
Map<String,dynamic> map = jsonDecode(jsonString);
Object obj = Object.fromJson(map);
🌟🌟🌟
// 직렬화 : 객체를 JSON 형태의 문자열로 변환할 때
// 객체 -> Map -> String
// jsonEncode
// 객체에 toJson 메서드 구현
// 역직렬화 : JSON 형태의 문자열을 객체로 변환할 때
// String -> Map -> 객체로 바꿔준다
// String -> Map : jsonDecode 함수
// Map -> 객체 : 객체에 fromJson named 생성자 구현해서 사용!
💡 Dart 객체로 변환해서 쓰는 이유
객체로 변환하지 않으면 Map 에서 계속 키값으로 찾아야돼서 타입이 헷갈리고 오타 발생할 수 있음.
import 'dart:convert';
// 직렬화 : 객체를 JSON 형태의 문자열로 변환할 때
// 객체 -> Map -> String
// jsonEncode
// 객체에 toJson 메서드 구현
// 역직렬화 : JSON 형태의 문자열을 객체로 변환할 때
// String -> Map -> 객체로 바꿔준다
// String -> Map : jsonDecode 함수
// Map -> 객체 : 객체에 fromJson named 생성자 구현해서 사용!
void main() {
// Pet
String easyJson = """
{
"name": "오상구",
"age": 7,
"isMale" : true
}
""";
// 1. String -> Map 형태로 바꾼다
Map<String, dynamic> easyMap = jsonDecode(easyJson);
// 3. Map -> Class 객체로 바꾼다
Pet pet = Pet.fromJson(easyMap);
print(pet.toJson());
// PetDetail
// Contact
String hardJson = """
{
"name": "오상구",
"age": 7,
"isMale" : true,
"favorite_foods" : ["삼겹살", "연어", "고구마"],
"contact": {
"mobile": "010-0000-0000",
"email": null
}
}
""";
// 1. jsonString -> Map형태로 바꾼다.
final hardMap = jsonDecode(hardJson);
// 3. class를 정의했으니 객체로 만든다. (Map을)
PetDetail petDetail = PetDetail.fromJson(hardMap);
print(petDetail.toJson());
}
// 2. 객체로 바꾸기 위해서 class를 정의한다.
class PetDetail{
String name;
int age;
bool isMale;
List<String> favoriteFoods;
Contact contact;
PetDetail({
required this.name,
required this.age,
required this.isMale,
required this.favoriteFoods,
required this.contact,
});
// fromJson 네임드 생성자
PetDetail.fromJson(Map<String,dynamic> map)
: this(
name: map['name'],
age: map['age'],
isMale: map['isMale'],
favoriteFoods: List.from(map['favorite_foods']),
contact: Contact.fromJson(map['contact']),
);
// toJson 메서드
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'isMale' : isMale,
'favorite_foods' : favoriteFoods,
'contact': contact.toJson(),
};
}
}
class Contact {
String mobile;
String? email;
Contact({required this.mobile, required this.email});
// Contact. fromJson 네임드 생성자 만들기
Contact.fromJson(Map<String, dynamic> map)
: this(mobile: map['mobile'], email: map['email']);
// toJson 메서드 만들기
Map<String, dynamic> toJson() {
return {'mobile': mobile, 'email': email,};
}
}
// 2. class를 정의한다
// name, age, isMale
class Pet {
String name;
int age;
bool isMale;
Pet({required this.name, required this.age, required this.isMale});
// fromJson named 생성자 만들기
Pet.fromJson(Map<String, dynamic> map)
: this(name: map['name'], age: map['age'], isMale: map['isMale']);
// Map<String, dynamic> toJson 만들기
Map<String, dynamic> toJson() {
return {'name': name, 'age': age, 'isMale': isMale};
}
}
fromJson : Map -> Pet객체
toJson: Pet 객체 -> Map
JSON 데이터를 객체로 변환하고, 다시 Map/JSON으로 바꿀 수 있음.
favoriteFoods는 JSON 리스트 -> Dart리스트로 변환
contact는 중첩 JSON -> Contact 객체로 변환
toJson()에서 다시 Map으로 직렬화 가능
JSON 문자열을jsonDecode()로 Map으로 변환
Map을 클래스의fromJson()생성자로 객체로 변환
필요하면toJson()으로 다시 Map/JSON으로 변환
MVVM
Model + View + ViewModel
Model, View, ViewModel로 계층을 나누어서 개발
Model: 데이터를 서버 등에서 가지고 오는 계층, 데이터 클래스 그 자체도 포함.
JSON 예제에서 User, Pet 클래스 -> Model 계층, 데이터 클래스를 Model이라고도 부름.
서버에서 가지고 올 때
각 모델(데이터클래스) 별로 Repoeitory 만들어서 가지고 와서
JSON을 객체로 변환해서 반환
View: 화면을 구현하는 계층 - 위젯
ViewModel : Model 계층(Repository)에서 데이터(Model클래스)를 가지고 와서
가공하는 계층
StatefulWidget (많은 역할 수행 시 코드가 지저분해짐) 동작원리
사용자 클릭, 로직 처리 -> 데이터 요청해서 데이터 받음 ->
받은 데이터 가공 및 상태 업데이트 -> 화면 업데이트
MVVM 동작원리
ViewModel구독(변경되는지 바라보고 있음) -> 사용자 클릭했으니 처리해! -> 로직처리
-> 데이터 요청해서 데이터 받음 -> 받은 데이터 가공 및 상태 업데이트 ->
자신의 상태가 바뀌었다고 알림(View가 누군지는 모름) ->
뷰는 ViewModel을 구독하고 있기 때문에 상태가 바뀌었다는 걸 감지, 화면 업데이트
MVVM 장점
유지보수가 편해짐, 오류발생 감소, 중복코드 감소
각각 역할이 분리되어 있어 각자 역할에 맞는 테스트 작성 가능.
Flutter에서 MVVM의 구현은 어떻게 하나요?
상태관리 라이브러리를 쓰면 편하게 구현 가능.
'RiverPod'이라는 상태관리 라이브러리 사용
[실습]
New : Flutter Project - application 생성
터미널에서 flutter pub get flutter_riverpod
(마우스커서 cmd+x : 아래에서 위로 올라오면서 내용삭제 됨)
기초공사가 잘 안되어서 그런지 사실 들어도 그런가보다 하면서 듣고 있다.
중등 수학 후루룩 건너뛰고 고등 수학으로 넘어온 느낌...
날 잡고 한번 벼락공부를 해야할 것 같은데...컨디션이 따라주질 않는다.😂
일단 되는대로 듣기라도 하자...
2. 인사이트클럽
책<미니멀리스트 창업가> 사힐 라빈지아 지음, 박재영 옮김, CAPITALEDGE
Chapter.5 진정성으로 승부하라
SNS 회사 계정과 개인 계정을 동시에 만든다.
사람들은 상대방의 사업과 그 사업의 성공여부에는 크게 관심이 없다.
그들의 관심사는 오히려 한 인간의 실제 모습과 그 인간이 분투하는 과정이다.
(p.180)
과거의 유튜버 신사임당이 쇼핑몰 다마고치 콘텐츠를 하는 것도,
백만장자가 제로부터 다시 시작하는 리얼다큐 프로그램을 보면서도 그렇고,
사람들이 강한 인상을 받을 수 있는, 영감을 줄 수 있을 만한 무언가가 필요하다.
우리 팀에게 그것은 무엇일까.
창업이라는 게 정해진 답이 없고 과정과 실행을 직접 설계해서 진행하기 때문에
어렵고, 한편으로는 흥미로우며, 막막함이 동시에 다가온다.
해야될 것은 많은데 우선순위를 정하는게 쉽지 않다.
일단 우리의 고객을 100명 모으기 위한 작업이 필요하다.
커뮤니티를 만들거나, 기존에 있는 커뮤니티를 활용하거나,
콘텐츠를 계속 제공해야 하고,
MVP를 명확하게 만들어야 한다.
페르소나를 구체화해야 한다고 하는데,
일단 '조금 넓은 범위의 고객들에게 테스트를 하는 것이 좀 더 나은 것은 아닐까'하는 생각이 든다.
페르소나를 구체화 하기 위해서 고객 데이터가 더 많이 필요한 것일지도 모르겠다.
댓글
댓글 쓰기