플로우(Flow)는 데이터 스트림을 비동기적으로 처리하기 위한 강력한 도구입니다. 플로우 연산자는 플로우 내에서 데이터를 변환하거나 처리할 때 사용하는 중간 연산자(intermediate operators)와 최종 연산자(terminal operators)로 나뉩니다. 플로우 연산자를 통해 데이터를 필터링, 변형, 조합하거나 오류를 처리하는 등 다양한 작업을 수행할 수 있습니다.1. 플로우의 구조중간 연산자: 플로우 내 데이터를 변형하거나 필터링하는 역할을 하며, 여러 번 사용할 수 있습니다. 플로우 자체를 변경하지 않고, 콜드 스트림을 유지합니다.최종 연산자: 플로우에서 데이터를 수집하는 역할을 하며, 데이터의 처리가 이 연산자를 통해서 완료됩니다. collect가 대표적입니다.2. 중간 연산자 (In..
1. Stream과 Flow의 차이점1.1 동기 vs 비동기Stream: 자바의 Stream API는 동기적으로 작동합니다. 이는 한 번에 하나의 스레드에서만 데이터를 처리할 수 있으며, 비동기 처리에는 적합하지 않습니다.Flow: 비동기적으로 데이터를 처리할 수 있도록 설계된 코틀린의 API입니다. 플로우는 코루틴을 기반으로 하며, 동시에 여러 작업을 처리할 수 있습니다. 지연된 데이터를 처리하거나 리액티브 프로그래밍이 필요할 때 유리합니다.1.2 백프레셔(Backpressure) 지원Stream: 자바의 스트림은 백프레셔를 지원하지 않습니다. 백프레셔는 데이터가 너무 빨리 방출되어 소비자가 이를 감당할 수 없는 상황을 처리하는 메커니즘인데, 스트림은 데이터 소비 속도를 제어할 방법이 없습니다.Flow..
1. 채널(Channel)의 실서비스 사용 예시: 채팅 애플리케이션채널(Channel)은 실시간 통신을 처리하는 데 유용하며, 채팅 애플리케이션에서 사용자 메시지의 송수신을 관리하는 데 활용될 수 있습니다. 각 사용자가 채널을 통해 실시간으로 메시지를 보내고 받는 구조를 구성할 수 있습니다.예시: 채팅 애플리케이션에서 채널 사용import kotlinx.coroutines.*import kotlinx.coroutines.channels.*data class Message(val from: String, val content: String)// 채팅방 클래스class ChatRoom { private val messageChannel = Channel() // 채널 생성 // 메시지 송신자 ..
1. launch란?launch는 새로운 코루틴을 시작하는 코루틴 빌더입니다. 비동기적으로 작업을 시작하며, 결과를 반환하지 않는다는 점에서 async와 차별됩니다.코루틴을 시작하는 함수로, 실행된 코루틴은 비동기로 동작합니다.경량 스레드와 비슷한 개념으로, 별도의 스레드를 차지하지 않고 코루틴이 독립적으로 실행됩니다.launch로 생성된 코루틴은 결과값을 반환하지 않으며, 종료된 시점을 명시적으로 기다리거나 확인할 필요가 없을 때 사용합니다.간단한 예제 (launch):import kotlinx.coroutines.*fun main() = runBlocking { // launch를 사용해 새로운 코루틴을 시작 launch { delay(1000L) println("..
7. 실제 프로젝트 적용 예제프로젝트 개요이번 프로젝트에서는 간단한 네트워킹 요청을 비동기로 처리하고, 이를 코루틴을 사용해 효율적으로 관리하는 방법을 다룹니다. 가정해보는 시나리오는 여러 REST API 호출을 병렬로 처리하고, 결과를 병합하는 상황입니다.7.1 프로젝트 구성fetchDataFromApi1(): 첫 번째 API에서 데이터를 가져오는 비동기 함수.fetchDataFromApi2(): 두 번째 API에서 데이터를 가져오는 비동기 함수.processData(): 두 API에서 받은 데이터를 처리하는 함수.구조화된 동시성(Structured Concurrency)를 사용하여 병렬 작업을 관리하고, 예외 발생 시 안전하게 처리하는 방식으로 진행합니다.7.2 코드 예제: 병렬 네트워킹 요청 처리i..
6. 코루틴 취소 및 타임아웃6.1 코루틴 취소 (Cancellation)코루틴은 비동기적으로 동작하므로, 때로는 진행 중인 작업을 중단해야 할 필요가 있습니다. 코루틴을 취소하는 것은 중요한 작업이며, 취소된 코루틴은 즉시 중단되지만 정리 작업(clean-up)을 할 수 있는 기회도 제공합니다.코루틴의 취소는 협력적으로 이루어집니다. 이는 코루틴이 명시적으로 취소 상태를 확인하거나, 취소 가능한 함수(delay, yield 등)를 호출할 때만 취소된다는 뜻입니다.코루틴 취소의 기본 사용 예제import kotlinx.coroutines.*fun main() = runBlocking { val job = launch { repeat(1000) { i -> printl..