Post

[Capstone-Start] Dart ํ•™์Šต โ€” Future, async/await, Stream

[Capstone-Start] Dart ํ•™์Šต โ€” Future, async/await, Stream

๐Ÿ“… ์ผ์‹œ: 2026. 05. 16

๐Ÿ’ฌ ๋‚ด์šฉ: Dart์˜ ๋น„๋™๊ธฐ ๋ชจ๋ธ โ€” Future<T>, async/await, Stream<T>์™€ JavaScript Promise ๋น„๊ต


์–ด์ œ๋Š” Dart์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ •๋ฆฌํ–ˆ๊ณ , ์˜ค๋Š˜์€ ๋‘ ๋ฒˆ์งธ ํ•™์Šต ์ฃผ์ œ๋กœ ๋น„๋™๊ธฐ ๋ชจ๋ธ์„ ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Flutter๋Š” API ํ˜ธ์ถœ, ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ๋„์ฒ˜์— ์žˆ๊ณ , ํ•ต์‹ฌ ์œ„์ ฏ์ธ FutureBuilder/StreamBuilder๊ฐ€ ๋น„๋™๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์œ„์ ฏ ํŠธ๋ฆฌ์— ์ง์ ‘ ๋ฌถ์–ด์ฃผ๋Š” ๊ตฌ์กฐ๋ผ ์ด ๋ถ€๋ถ„์„ ๋ชจ๋ฅด๋ฉด ํ•œ ์ค„๋„ ๋ชป ์งญ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ Dart์˜ ๋น„๋™๊ธฐ ๋ชจ๋ธ์€ JavaScript์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Single-threaded ์ด๋ฒคํŠธ ๋ฃจํ”„ ์œ„์—์„œ Future์™€ Stream์ด ๋Œ๊ณ , async/await ๋ฌธ๋ฒ•๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•™์Šต ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋Š”๋ฐ, Dart๋งŒ์˜ ๋””ํ…Œ์ผ(์˜ˆ: unawaited, async*/yield, ์—๋Ÿฌ ์ „ํŒŒ)์„ ์ •๋ฆฌํ•ด ๋‘ก๋‹ˆ๋‹ค.

1. Dart์˜ ๋™์‹œ์„ฑ ๋ชจ๋ธ โ€” Single-threaded ์ด๋ฒคํŠธ ๋ฃจํ”„

Dart๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ single isolate ์•ˆ์—์„œ single-threaded๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. JavaScript์˜ V8๊ณผ ๊ฐ™์€ ๋ชจ๋ธ๋กœ, ๋ชจ๋“  ๋น„๋™๊ธฐ ์ž‘์—…์€ ์ด๋ฒคํŠธ ํ์— ๋“ฑ๋ก๋˜์—ˆ๋‹ค๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         Dart Isolate                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚  Stack  โ”‚    โ”‚  Event Loop  โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚        โ–ฒ                โ–ผ           โ”‚
โ”‚        โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚        โ””โ”€โ”€โ”€โ”€โ”€โ”‚  Event Queue      โ”‚  โ”‚
โ”‚              โ”‚  Microtask Queue  โ”‚  โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด Isolate(๋ณ„๋„ ํ”„๋กœ์„ธ์Šค์— ๊ฐ€๊นŒ์šด ๊ฒฉ๋ฆฌ ๋‹จ์œ„)๋ฅผ ๋„์›Œ์•ผ ํ•˜๋Š”๋ฐ, ์บก์Šคํ†ค ๋ฒ”์œ„์—์„œ๋Š” ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋‚˜ ๋ฌด๊ฑฐ์šด JSON ํŒŒ์‹ฑ ์ •๋„๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑฐ์˜ ์•ˆ ์“ด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ single isolate๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

2. Future<T> โ€” Dart ๋ฒ„์ „์˜ Promise

Future<T>๋Š” โ€œ์–ธ์  ๊ฐ€ T ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒโ€œ์ด๋ผ๋Š” ๋ฏธ๋ž˜์˜ ์•ฝ์†์ž…๋‹ˆ๋‹ค. JavaScript์˜ Promise<T>์™€ ์˜๋ฏธยท๋™์ž‘์ด ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
Future<int> fetchUserId() async {
  await Future.delayed(const Duration(seconds: 1));
  return 42;
}

then ์ฒด์ด๋‹ vs async/await

Future๋Š” .then / .catchError / .whenComplete๋กœ๋„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ async/await์„ ์”๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// .then ๋ฐฉ์‹ โ€” ๊ฐ€๋…์„ฑ ๋–จ์–ด์ง
fetchUserId()
  .then((id) => fetchUser(id))
  .then((user) => print(user.name))
  .catchError((e) => print('์—๋Ÿฌ: $e'));

// async/await โ€” sequentialํ•˜๊ฒŒ ์ฝํž˜
try {
  final id = await fetchUserId();
  final user = await fetchUser(id);
  print(user.name);
} catch (e) {
  print('์—๋Ÿฌ: $e');
}

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ โ€” Future.wait

์—ฌ๋Ÿฌ Future๋ฅผ ๋™์‹œ์— ๊ธฐ๋‹ค๋ฆฌ๋ ค๋ฉด Future.wait์„ ์”๋‹ˆ๋‹ค. TypeScript์˜ Promise.all๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
final results = await Future.wait([
  fetchUser(1),
  fetchUser(2),
  fetchUser(3),
]);
// results๋Š” List<User>

๋ณ‘๋ ฌ ์‹คํ–‰์ด ์˜๋ฏธ ์žˆ๋Š” ๊ฑด ๋…๋ฆฝ์ ์ธ ์ž‘์—…์ผ ๋•Œ์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ์˜์กดํ•˜๋ฉด ๊ทธ๋ƒฅ await์„ ๋‘ ๋ฒˆ ๋ถ€๋ฅด๋Š” ๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
// โŒ ์ž˜๋ชป โ€” ๋‘ ํ˜ธ์ถœ์ด ๋…๋ฆฝ์ ์ธ๋ฐ sequential
final user = await fetchUser(1);
final orders = await fetchOrders(1);

// โœ… ๋ณ‘๋ ฌ
final results = await Future.wait([fetchUser(1), fetchOrders(1)]);
final user = results[0] as User;
final orders = results[1] as List<Order>;

unawaited โ€” ์˜๋„์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์„ ๋•Œ

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฉด, Dart ๋ถ„์„๊ธฐ๊ฐ€ unawaited_futures ๊ฒฝ๊ณ ๋ฅผ ๋„์›๋‹ˆ๋‹ค. ๋กœ๊น…์ด๋‚˜ fire-and-forget ํŒจํ„ด์ฒ˜๋Ÿผ ์˜๋„์ ์œผ๋กœ ๋ฌด์‹œํ•  ๋•Œ๋Š” unawaited() ํ•จ์ˆ˜๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
import 'dart:async';

void main() {
  unawaited(logToServer('app_started')); // ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ์„ ๋ช…์‹œ
  // ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ์ง„ํ–‰
}

์ด ์ž‘์€ wrapper ํ•œ ์ค„์ด โ€œ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋‹คโ€๋ผ๋Š” ์˜๋„๋ฅผ ์ฝ”๋“œ์— ๋ฐ•์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

3. async/await์€ JavaScript์™€ ๊ฑฐ์˜ ๊ฐ™๋‹ค

๋ฌธ๋ฒ•์€ JavaScript์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. async๋กœ ํ‘œ์‹œ๋œ ํ•จ์ˆ˜๋Š” ์ž๋™์œผ๋กœ Future๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , await์€ Future๋ฅผ ํ’€์–ด์„œ ๊ฐ’์„ ๊บผ๋ƒ…๋‹ˆ๋‹ค.

1
2
3
4
Future<User> fetchUser(int id) async {
  final response = await dio.get('/users/$id');
  return User.fromJson(response.data);
}

๋‹ค๋งŒ ํ•œ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript๋Š” async ํ•จ์ˆ˜๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ return์ด ์—†์–ด๋„ Promise<void>๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, Dart๋Š” Future<void>๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ๋ถ„์„๊ธฐ๊ฐ€ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

1
2
3
Future<void> sendLog(String event) async {
  await dio.post('/logs', data: {'event': event});
}

์—๋Ÿฌ ์ „ํŒŒ

async ํ•จ์ˆ˜ ์•ˆ์—์„œ throwํ•˜๋ฉด ๊ทธ๋Œ€๋กœ Future๊ฐ€ reject๋ฉ๋‹ˆ๋‹ค. try/catch๋กœ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
Future<User> fetchUser(int id) async {
  try {
    final response = await dio.get('/users/$id');
    return User.fromJson(response.data);
  } on DioException catch (e) {
    // dio๊ฐ€ ๋˜์ง„ 4xx/5xx
    throw NetworkError(e.message ?? 'unknown');
  } catch (e) {
    // ๊ทธ ์™ธ ๋ชจ๋“  ์˜ˆ์™ธ
    throw UnknownError(e);
  }
}

on TypeName catch (e) ๊ตฌ๋ฌธ์€ Java์˜ catch (TypeName e)์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํƒ€์ž…๋ณ„๋กœ catch ๋ธ”๋ก์„ ๋ถ„๊ธฐํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

4. Stream<T> โ€” ์—ฌ๋Ÿฌ ๊ฐ’์„ ์‹œ๊ฐ„์ฐจ๋กœ emit

Future๋Š” โ€œํ•œ ๋ฒˆ ๊ฐ’์ด ์˜ค๊ณ  ๋โ€์ด์ง€๋งŒ, Stream์€ โ€œ๊ฐ’์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๊ฐ„์ฐจ๋กœ emit๋œ๋‹คโ€๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. RxJS์˜ Observable์ด๋‚˜ Kotlin์˜ Flow์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

Stream ๊ตฌ๋…

1
2
3
4
5
6
7
8
9
final clock = Stream.periodic(
  const Duration(seconds: 1),
  (count) => count,
);

await for (final tick in clock) {
  print('tick: $tick');
  if (tick >= 3) break;
}

๋˜๋Š” .listen์„ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
final subscription = clock.listen((tick) {
  print('tick: $tick');
});

// ๋‚˜์ค‘์— ๊ตฌ๋… ํ•ด์ œ
await subscription.cancel();

async* / yield โ€” Stream ์ƒ์„ฑ

ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ Stream์„ emitํ•˜๋„๋ก ๋งŒ๋“ค๋ ค๋ฉด async*์™€ yield๋ฅผ ์”๋‹ˆ๋‹ค. Python์˜ generator์™€ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
Stream<int> countTo(int n) async* {
  for (var i = 1; i <= n; i++) {
    await Future.delayed(const Duration(milliseconds: 500));
    yield i;
  }
}

void main() async {
  await for (final v in countTo(5)) {
    print(v); // 1, 2, 3, 4, 5
  }
}

Broadcast Stream

๊ธฐ๋ณธ Stream์€ single-subscription์ด๋ผ ํ•œ ๋ฒˆ์— ํ•œ ๋ช…๋งŒ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ ค๋ฉด .asBroadcastStream()์œผ๋กœ broadcast๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ํŒจ๋„, ์œ„์น˜ ์ถ”์  ๊ฐ™์€ ๊ณณ์—์„œ ์ž์ฃผ ์“ฐ์ž…๋‹ˆ๋‹ค.

1
2
3
final broadcast = sourceStream.asBroadcastStream();
broadcast.listen((e) => print('subscriber A: $e'));
broadcast.listen((e) => print('subscriber B: $e'));

5. ์บก์Šคํ†ค์—์„œ ๋ฏธ๋ฆฌ ๊ทธ๋ ค๋ณธ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

์•„์ง ์ฝ”๋“œ๋ฅผ ์งœ์ง„ ์•Š์•˜์ง€๋งŒ, ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์บก์Šคํ†ค ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘ํ• ์ง€ ๋จธ๋ฆฟ์†์œผ๋กœ ๊ทธ๋ ค๋ดค์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด / ๊ธฐ๋Šฅ๋น„๋™๊ธฐ ํŒจํ„ดFuture / Stream
์‹๋‹จ ๋ถ„์„ API ํ˜ธ์ถœํ•œ ๋ฒˆ ํ˜ธ์ถœ ํ›„ ๊ฒฐ๊ณผFuture<DietAnalysis>
๋Œ€์‹œ๋ณด๋“œ ๋ฐ์ดํ„ฐ fetch์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ ๋ณ‘๋ ฌ ํ˜ธ์ถœFuture.wait
์•Œ๋ฆผ ํŒจ๋„ ์‹ค์‹œ๊ฐ„ ๊ฐฑ์‹ ์‹œ๊ฐ„์ฐจ๋กœ ๋„์ฐฉํ•˜๋Š” ์ด๋ฒคํŠธStream<Notification>
์šด๋™ ํƒ€์ด๋จธ / ์ŠคํŠธ๋ฆญ ์นด์šดํ„ฐ1์ดˆ๋งˆ๋‹ค emitStream.periodic
์œ„์น˜ ์ถ”์  (Place ํ™”๋ฉด)์œ„์น˜๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค emitStream<Position>

Flutter์—์„œ๋Š” FutureBuilder<T>์™€ StreamBuilder<T>๊ฐ€ ์ด ๋‘ ํŒจํ„ด์„ ์œ„์ ฏ ํŠธ๋ฆฌ์— ์ง์ ‘ ๋ฌถ์–ด์ฃผ๋Š” ์œ„์ ฏ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. snapshot.connectionState๋กœ ๋กœ๋”ฉ/์™„๋ฃŒ/์—๋Ÿฌ ์ƒํƒœ๋ฅผ ๋ถ„๊ธฐํ•˜๋Š” ํ๋ฆ„์ด ํ‘œ์ค€ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

6. ํ•™์Šต ํ›„ ์•Œ๊ฒŒ ๋œ ๊ฒƒ / ๋‚ด์ผ ๊ณ„ํš

์˜ค๋Š˜ ์ •๋ฆฌํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๋‹ค์Œ์ž…๋‹ˆ๋‹ค.

  1. Dart ๋น„๋™๊ธฐ๋Š” JavaScript์™€ ๋ชจ๋ธยท๋ฌธ๋ฒ•์ด ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Future = Promise, async/await๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•™์Šต ๋น„์šฉ์ด ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒŒ ํฐ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.
  2. Stream์€ ํ•œ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋ฒˆ emit๋˜๋Š” ๋น„๋™๊ธฐ์ž…๋‹ˆ๋‹ค. RxJS Observable๊ณผ ๊ฐ™์€ ๊ฐœ๋…์ด๋ผ ์œ„์ ฏ์— ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์„ ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
  3. unawaited()๋กœ fire-and-forget์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ˆ„๋ฝ๋œ await๋ฅผ ์žก๊ธฐ ์œ„ํ•œ ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค.

๋‚ด์ผ์€ Dart์˜ ํ•จ์ˆ˜ โ€” ์ผ๊ธ‰ ๊ฐ์ฒด, typedef, ํด๋กœ์ €๋ฅผ ๊ณต๋ถ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. Flutter์˜ ํ•ต์‹ฌ ํŒจํ„ด์ธ Builder(ListView.builder, FutureBuilder ๋“ฑ)๊ฐ€ ๋ชจ๋‘ โ€œํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ์œ„์ ฏโ€์ด๋ผ, ํ•จ์ˆ˜ ํƒ€์ž…์„ ์ž˜ ๋‹ค๋ฃจ์ง€ ๋ชปํ•˜๋ฉด ์œ„์ ฏ ์ฝ”๋“œ๊ฐ€ ๊นจ๋—ํ•˜๊ฒŒ ์•ˆ ๋‚˜์˜ต๋‹ˆ๋‹ค.


๐Ÿ“Œ ์š”์•ฝ

Dart์˜ ๋น„๋™๊ธฐ ๋ชจ๋ธ์€ JavaScript์™€ ๊ฑฐ์˜ ๋™์ผํ•œ single-threaded ์ด๋ฒคํŠธ ๋ฃจํ”„ ์œ„์˜ Future<T> + Stream<T> ํŒจํ„ด์ž…๋‹ˆ๋‹ค. Future๋Š” ํ•œ ๋ฒˆ ๊ฐ’, Stream์€ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. Future.wait๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ, unawaited๋กœ ์˜๋„์  ๋ฌด์‹œ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ , async*/yield๋กœ Stream์„ ์ง์ ‘ emitํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Flutter์—์„œ๋Š” ์ด ๋‘ ๋น„๋™๊ธฐ ํƒ€์ž…์ด FutureBuilder/StreamBuilder๋กœ ์œ„์ ฏ ํŠธ๋ฆฌ์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ๋ผ ๋น„๋™๊ธฐ ๋ชจ๋ธ ์ดํ•ด๊ฐ€ ํ™”๋ฉด ์ฝ”๋“œ ์ž‘์„ฑ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.