[Dart] fromJson constructor는 왜 factory로 만들까?

Overview Dart에서 JSON을 parsing하는 class를 만들 때 fromJson이라는 factory named constructor를 만들곤 한다. class Person { final String name; final int age; Person({required this.name, required this.age}); // ✅ factory Person.fromJson(Map<String, dynamic> json) => Person(name: json["name"], age: json["age"]); } 그런데, fromJson constructor는 factory가 아니어도 아무 문제가 없다. class Person { final String name; final int age; Person({required this.name, required this.age}); // ✅ Person.fromJson1(Map<String, dynamic> json) : name = json["name"], age = json["age"]; } Dart 문서의 예시에서도 fromJson을 factory constructor로 만들고 있다....

September 22, 2024 · 2 min

[Dart] Isolate 요약

Dart isolate 관련 문서들을 참고하여 isolate의 개념 및 동작방식을 요약한다. 참고한 문서 Concurrency in Dart | dart.dev Isolates | dart.dev Concurrency and isolates | Flutter docs Isolate 사용 이유 모든 Dart code는 기본적으로 main isolate에서 실행된다. Main isolates의 event loop는 UI paint, I/O, user input 등 UI 관련 event들을 처리한다. Main isolate에서 시간이 오래 걸리는 작업을 실행하면 event loop가 다음 repaint event 처리 시점을 놓치게 되면서 UI freezing이 발생할 수 있다....

September 21, 2024 · 4 min

[Dart] Understanding null safety

Overview 이 글은 Understanding null safety 문서의 내용을 바탕으로 Dart에서 null safety가 나온 배경 및 null safety의 동작 방식을 쉽게 이해하기 위해 작성하였다. 기본 문법적인 설명들을 제외하고 null safety의 원리를 이해하는데 필요하다고 생각되는 부분들만 정리했기 때문에 원문의 일부 내용이 누락되어 있고 설명하는 순서도 다르다. 빠르게 Dart null safety의 동작 방식에 대해 이해하는 것이 목적이라면 이 글을 이해하는 것으로 충분하겠지만, 더 자세한 설명이 필요하다면 원문을 정독하는 것을 권한다. Null safety가 나온 이유 Dart에서 null은 Null type으로 표현된다....

September 15, 2024 · 6 min

Retry with Exponential Back-Off and Jitter

최근 본 면접에서 새로 알게 된 Exponential Back-Off 라는 개념과 Jitter를 사용한 개선 방법을 공부하고 정리한다. 그리고, Flutter 앱을 개발할 때 이 전략을 활용하기 위해 Dart code로 구현해 본다. Retry Strategy 어떤 system에서 다른 system을 call하는 상황에서 failure는 언제든지 발생할 수 있다. 앱을 개발할 때는 server 부하 또는 일시적인 network 오류 등에 의해 http 요청이 오랜 시간 동안 완료되지 않거나 실패하는 상황을 떠올릴 수 있다. 이러한 일시적인 문제 때문에 client에서 server로 보내는 data가 유실될 수 있는데, 이것을 막기 위해 여러 가지 방법으로 retry 전략을 세운다....

September 13, 2024 · 4 min

[Dart] DI를 위한 interface 만들기

Overview DIP를 준수하는 class 설계를 위해 interface가 필요하다. 이 interface는 일반 class만 사용해도 쉽게 구현할 수 있다. 아래는 clean architecture에서 use case에서 repository 의존성을 분리하여 의존성 흐름이 adapter에서 business logic 계층으로 향하도록 역전시키는 구현 예시이다. Adaptor 계층에서 repository pattern을 사용하여 use case가 repository 의존성을 주입받는다. class Repository { String fetchData() { throw Exception("Not implemented"); }; } class RepositoryImpl extends Repository { @override String fetchData() { return storage.getData(); } } class UseCaseImpl extends UseCase { UseCaseImpl({required this....

September 10, 2024 · 4 min

[Dart] Iterable collections

Iterable collections Dart 문서 읽기 Collection과 Iterable Collection : element의 집합을 표현하는 객체 (e.g. List, Set, Map) Iterable : element에 순차적으로 접근할 수 있는 collection의 한 종류 Iterable abstract class를 상속받은 List, Set 등을 통해 Iterable 객체 생성 Map은 key를 사용해서 value를 얻는 방식으로 Iterable이 아님. 단, entries나 values 속성을 통해 key 또는 value group을 Iterable 객체로 읽을 수 있음 Iterable과 List는 element에 접근하는 방법에 차이가 있음 List는 [index] operator를 사용하지만, Iterable은 elementAt(index) method를 사용해서 특정 index의 element에 접근...

August 17, 2024 · 4 min

[Dart] List.from, List.of, toList() 비교

Summary 셋 모두 Iterable object를 동일한 element를 가진 새 List로 copy할 때 사용할 수 있다. toList()는 List.of의 short-hand method로 서로 같다. List.from은 original Iterable의 element들을 runtime에 result type으로 casting하고, casting에 실패하면 runtime error를 발생시킨다. List.of는 original Iterable의 element들이 result type과 같거나 하위 type인지 compile-time에 check하고, type이 호환되지 않으면 compile-time error를 발생시킨다. List.from은 original Iterable을 down casting할 때 사용할 수 있고, List.of는 up casting할 때 사용할 수 있다. Copy 할 때 original type을 지켜야 한다면 toList() 또는 List....

August 4, 2024 · 3 min

[Dart] Dart에서 type casting을 안전하게 하는 방법

Swift에서는 as?로 안전하게 type casting을 할 수 있었다. class A {} class B: A {} class C {} let a = A() let b = B() b as? C// nil Dart는 as keyword로 type casting을 할 수 있지만, incompatible type으로 casting을 시도하면 type error가 발생한다. Dart에는 optional casting 연산자가 따로 없으므로, error 없이 type casting을 하려면 type check를 먼저 해야 한다. class A {} class B extends A {} class C {} final a = A(); final b = B(); a as C // ❗️ type error if (a is C) { a as C // Never executed } if (a is B) { a as B // ✅ OK } 매번 type check를 하려면 번거로우므로, 아래와 같은 extension을 만들어서 사용하면 편리하다....

July 20, 2024 · 1 min