안녕하세요 아이티 박사 HO입니다.  flutter 면접 질문 #3 Stream에 대해서 알아보겠습니다.


Flutter에서 Stream은 비동기 이벤트의 시퀀스를 다루는 데 사용됩니다. Dart 언어의 일부로 제공되며, 데이터 조각이나 이벤트가 시간에 따라 하나씩 생성될 때 이를 처리하는 데 유용합니다. 예를 들어, 사용자의 입력, 파일 읽기, 네트워크 요청의 결과 등이 이에 해당될 수 있습니다.



Stream의 유형

Single subscription streams: 한 번에 하나의 리스너(subscriber)만 가질 수 있는 스트림입니다. 예를 들어, 파일의 내용을 읽는 스트림이 이에 해당됩니다. 이 스트림은 데이터를 요청하는 순서대로 데이터를 제공합니다.


Broadcast streams: 여러 리스너를 가질 수 있는 스트림입니다. 이벤트 브로드캐스트에 사용되며, 모든 리스너가 동시에 이벤트를 수신할 수 있습니다.


예시 코드

다음 예시에서는 Dart에서 Stream을 생성하고, 스트림에 이벤트를 추가한 다음, 이 이벤트를 구독하여 처리하는 방법을 보여줍니다. 이 예시는 간단한 카운트 다운 타이머를 구현합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import 'dart:async';
 
void main() {
  // StreamController를 생성합니다.
  final StreamController<int> controller = StreamController<int>();
 
  // 스트림에 리스너를 추가합니다. 스트림에서 이벤트가 발생할 때마다 해당 데이터를 출력합니다.
  controller.stream.listen((data) {
    print('Received: $data');
  }, onDone: () {
    print('Stream is closed');
  });
 
  // 스트림에 데이터를 추가합니다.
  Future.forEach<int>([321], (int number) {
    return Future.delayed(Duration(seconds: 1), () {
      controller.sink.add(number);
    });
  }).then((_) => controller.close());  // 모든 데이터 처리가 끝나면 스트림을 닫습니다.
 
  // 스트림을 닫습니다.
  // controller.close();
}
 
cs
이 코드는 3, 2, 1을 각각 1초 간격으로 스트림에 추가하고, 각 숫자가 스트림에 추가될 때마다 출력합니다. 마지막으로 스트림이 닫히고, "Stream is closed" 메시지가 출력됩니다.


Stream 사용 시 고려사항
에러 처리: 스트림에서 에러가 발생할 수 있으므로, onError 콜백을 제공하여 에러를 적절히 처리해야 합니다.
리소스 관리: StreamController를 사용할 때는 스트림 사용이 끝난 후에 close 메서드를 호출하여 리소스를 해제해야 합니다.
비동기 작업: 스트림은 비동기 작업과 밀접하게 연관되어 있으므로, async와 await, Future와 같은 비동기 패턴을 잘 이해하는 것이 중요합니다.
Flutter에서 스트림은 상태 업데이트, 사용자 인터페이스 이벤트 처리 등 다양한 용도로 사용될 수 있으며, StreamBuilder 위젯과 함께 사용하여 비동기 데이터 스트림을 UI에 통합할 수 있습니다.