일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- node
- uint8array
- uint16array
- Completer
- Flutter
- Prism.js
- code editor
- androidId
- Image Resize typescript
- Game js
- Three-fiber
- Raycasting
- KakaoMap
- react
- FirebaseAnalytics
- REST API
- RouteObserver
- userevent_tracker
- Redux
- babel
- methodChannel
- webrtc
- identifierForVender
- jszip
- Three js
- swagger-typescript-api
- Babel standalone
- web track
- typescript
- Excel
- Today
- Total
Never give up
두번째 앱 등록 후기 본문
링크 : play.google.com/store/apps/details?id=com.recipe.recipe_reference
요번에 제작한 앱은 레시피 공유 앱입니다
Firebase로 많은 작업을 하는것은 처음이어서 기간을 길게 잡았었는데
Firebase부분 필요한 기능을 구현하는건 한주도 안걸렸습니다만
잦은 UI/UX변경 그리고 데이터 타입 변경등으로 시간이 엄청나게 지연되었습니다..
먼저 디자인과 기획 부분은 제 영역이 아닌걸 확실히 느꼈습니다
디자인은 얼핏봐도 이상해보이고 리터치해도 이상해보이고 리메이크해도 이상하고..
나중에 여유가 되면 전문 디자이너한테 맡기는게 났겠다 라는 느낌이 너무 많이 들었습니다..
그리고 기획부분은 그냥 두리뭉실하게 몇달! 이렇게 잡았는데
생각해보니 데이터타입은 어떻게 해야되고 구현과정에서 기술적인 에러사항 등을 캐치해야되는데
경험부족으로 시행착오법 소위 노가다... 를 많이 했습니다
더군다나 구글 스토어에 2월 3일에 올렸는데 첫 검토만 거의 2주가 걸렸습니다
검토기간도 짜증나는데 중간에 업데이트하려면 검수될 때까지 기다려야되더군요..
제가 기능을 못 찾은건지 아니면 원래 검토기간에는 취소가 불가능한건지..
이번에 제가한 삽질(?)중 가장 큰 문제였던건 Map의 key 문제입니다
Map안에 다양한 데이터들이 들어가는데 key 부분에서 유저의 닉네임-음식이름으로 했는데
생각해보니 닉네임이나 음식 이름을 변경하면 key를 새로 바꿔줘야되고
value의 닉네임, 음식이름도 같이 바꿔줘야되는 상황이 발생한거죠..
후자는 데이터의 변경이라 괜찮은데 전자는 update가 아닌 create delete라
서버 요청도 두번이나 해야되고 처리도 까다로워지는 아주 좋지않은 방법인거죠..
그래서 key를 email-생성날짜로 바꿨는데 제가 생각한대로 아주 잘 작동하더군요
근데 다른 앱 혹은 웹에서는 어떤식으로 관리를 하고 있는지 궁금해지더군요
그리고 아이디보다는 토큰을 사용했으면 어땠을까 하는 생각도 들더군요..
그리고 두번째로 큰 삽질은 데이터 모델을 만들어놓고 일일이 serialize를 하고 있었습니다
Future<void> readData() async {
await collection.get().then((value) {
value.docs.forEach((element) {
_map[element.id] = Item(
a: element[aKey],
b: List.castFrom(element[bKey] as List ?? []),
c: element[cKey],
d: element[dKey],
e: element[eKey],
f: element[fKey],
g: Map.castFrom(element[gKey] as Map ?? {}),
h: element[hKey],
i: element[iKey],
j: List.castFrom(element[jKey] as List ?? []));
});
});
}
이런식으로요..
먼저 await이랑 then을 같이 사용한것도 좋지 않은 방법이고
(저기서 then과 await을 같이 썼었던건 then은 blocking이 안돼서 사용했었습니다만 문제가 있는 코드입니다)
j부분은 불필요한 List to map, map to list도 하고 있었습니다..
사실 더 좋은 방법으로 할 수 있었는데 말이죠..
Future<void> readData() async {
QuerySnapshot snapshot = await collection.get();
snapshot.docs.forEach((element) {
_map[element.id] = Item.fromJson(element.data());
});
}
class Item{
//생략
factory Item.fromJson(Map<String, dynamic> json) {
List<Map<String, dynamic>> list = List.castFrom(json[commentKey]) ?? [];
List<jItem> j = [];
list.forEach((element) {
j.add(jItem.fromJson(element));
});
return Item(
a: json[aKey],
b: List.castFrom(json[bKey] as List ?? []),
c: json[cKey],
d: json[dKey],
e: json[eKey],
f: json[fKey],
g: Map.castFrom(json[gKey] as Map ?? {}),
h: json[hKey],
i: json[iKey],
j: j);
}
Map<String, dynamic> toJson() => {
aKey: a,
bKey: b,
cKey: c,
dKey: d,
eKey: e,
fKey: f,
gKey: g,
heKey: h,
iKey: i
};
//생략
}
코드가 좀 더 길어지긴 했지만 훨씬 직관적이고 유지보수도 용이하게 변경했습니다
새로운 시도를 하면서 재밌기도 하지만 제 노답실력에 많이 좌절을 한거 같습니다
앞으로 더 좋은 개발자가 되기위해 시행착오(삽질...)를 더 해보고
자만에 빠지지 않고 배움의 자세를 잃지 않기 위해 노력해야될거 같습니다..
'해왔던 삽질..' 카테고리의 다른 글
Flutter - Bloc의 이해 with stream (0) | 2021.02.28 |
---|---|
Flutter - list with paging (0) | 2021.02.24 |
Flutter - audio plugin test (0) | 2021.02.14 |
Flutter - Execution failed for task ':app:lintVitalRelease' (0) | 2021.01.21 |
Flutter - Locale data has not been initialized (5) | 2021.01.18 |