Dart의 Stream과 비동기 처리

비동기 프로그래밍은 현대 개발 환경에서 중요한 역할을 합니다. 특히 Dart에서 Stream은 비동기 데이터 처리에 유용한 도구입니다. 이번 글에서는 Dart의 Stream과 비동기 처리 방법에 대해 살펴보겠습니다.

 

Stream의 기본 개념

Stream은 비동기 데이터 이벤트의 연속적인 흐름을 나타냅니다. Dart에서 Stream은 이벤트 소스로부터 데이터를 비동기적으로 받아옵니다. 일반적으로 파일 읽기, 네트워크 요청, 사용자 입력 등에서 사용됩니다.

 

Stream 만들기

다음은 기본적인 Stream 생성 방법입니다:

Stream<int> numberStream = Stream<int>.periodic(Duration(seconds: 1), (x) => x).take(10);

위 예제는 1초마다 숫자를 생성하는 Stream을 만들고, 10개의 이벤트 후에 완료됩니다.

 

Stream 구독하기

Stream에서 데이터를 받아오기 위해서는 listen 메서드를 사용하여 구독(subscribe) 해야 합니다:

numberStream.listen((number) {
  print('Number: $number');
});

위 코드는 Stream의 각 이벤트를 출력합니다.

 

StreamController

StreamController를 사용하면 직접 Stream을 제어할 수 있습니다. 이를 통해 커스텀 스트림을 생성하고 이벤트를 추가할 수 있습니다.

final controller = StreamController<int>();

controller.stream.listen((data) {
  print('Received: $data');
});

controller.add(1);
controller.add(2);
controller.add(3);

controller.close();

이 예제에서는 StreamController를 사용하여 직접 이벤트를 추가하고, 스트림을 구독하여 데이터를 처리합니다.

 

비동기 처리와 Stream

Stream은 비동기적으로 데이터를 처리하므로 await와 async를 함께 사용할 수 있습니다.

 

await for

await for는 Stream의 각 이벤트를 비동기적으로 처리할 수 있는 구문입니다:

await for (var number in numberStream) {
  print('Number: $number');
}

이 코드는 Stream의 각 이벤트를 순차적으로 기다리면서 처리합니다.

 

StreamTransformer

StreamTransformer를 사용하면 Stream의 데이터를 변환할 수 있습니다:

final transformer = StreamTransformer<int, String>.fromHandlers(
  handleData: (number, sink) {
    sink.add('Number: $number');
  },
);

numberStream.transform(transformer).listen((data) {
  print(data);
});

이 예제는 Stream의 숫자 데이터를 문자열로 변환하여 출력합니다.

 

결론

Dart의 Stream은 비동기 데이터를 처리하는 강력한 도구입니다. Stream과 StreamController, await for 등의 기능을 활용하면 효율적인 비동기 프로그래밍이 가능합니다. 다양한 상황에서 Stream을 활용하여 비동기 데이터 흐름을 제어해 보세요.