728x90

✅ 1. Future
Future는 "미래에 완료될 값"을 나타내는 객체로 비동기적으로 수행하며, 그 결과(success of fail)을 담습니다.
import scala.concurrent.Future
import scala.util.{Success, Failure}
import scala.concurrent.ExecutionContext.Implicits.global
object FutureExample extends App {
val f: Future[Int] = Future {
// 시간이 걸리는 작업 (ex. 네트워크 요청)
Thread.sleep(1000)
42
}
// 결과 처리
f.onComplete {
case Success(value) => println(s"Result: $value")
case Failure(e) => println(s"Error: ${e.getMessage}")
}
Thread.sleep(2000)
}
✅ 2. for-comprehension으로 Future 조합
여러 Future를 순차적으로 처리하거나 서로 계산 결과를 합치고 싶을 때 사용합니다.
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}
object ForComprehensionExample extends App {
val f1 = Future { 10 }
val f2 = Future { 20 }
val result: Future[Int] = for {
a <- f1
b <- f2
} yield a + b
result.onComplete {
case Success(sum) => println(s"total: $sum")
case Failure(e) => println(s"fail: ${e.getMessage}")
}
Thread.sleep(1000) // App 종료 방지
}
- f1 완료 후 a에 값 저장
- f2 완료 후 b에 값 저장
- yield a + b -> 두 결과를 합산한 새로운 Future 반환
✅ 3. Await - 동기적으로 결과 가져오기
Future는 기본적으로 비동기이므로, 메인 스레드가 먼저 끝나면 결과를 확인할 수 없습니다. Await.result 를 쓰면 최대 시간 동안 동기적으로 기다립니다, 실제 서비스에서 사용하지는 않고, 테스트용으로만 사용합니다.
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object AwaitExample extends App {
val f = Future { 100 }
val result = Await.result(f, 2.seconds)
println(s"Await result: $result")
}
- 최대 2초 동안 기다려 결과 반환
- 시간 초과 시 TimeoutException 발생 가능
✅ 4. ExecutionContext - 스레드 풀 직접 지정
ExecutionContext는 Future가 어떤 스레드에서 실행될지를 결정하며 global을 쓰거나 직접 스레드 풀을 생성할 수 있습니다. 큰 프로젝트에서는 동시 실행 수를 제어할 때 사용됩니다.
import scala.concurrent.{Future, ExecutionContext}
import java.util.concurrent.Executors
import scala.util.{Success,Failure}
object CustomECExample extends App {
// 글로벌 ExecutionContext를 implicit로 지정
implicit val ec = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(4))
val f = Future {
println(s"Thread: ${Thread.currentThread().getName}")
42
}(ec) // Future 실행 시 명시적으로 ec 전달
f.onComplete {
case Success(value) => println(s"result: $value")
case Failure(e) => println(s"Fail: ${e.getMessage}")
}
Thread.sleep(1000)
ec.shutdown()
}
- onComplete를 포함한 모든 후속 Future 작업에 implicit ExecutionContext 필요
- 글로벌 ExecutionContext 하나만 선언해주면 해결
✅ 요약
- Future: 스칼라의 비동기 실행 단위
- ExecutionContext: Future가 들어갈 스레드폴(실행 환경), 없으면 컴파일 에러
- 결과 처리: onComplete로 성공/실패 처리
- 조합:여러 Future는 for-comprehension으로 묶음
- Await: 결과를 동기적으로 기다릴 때 사용(권장 X)
GitHub - Koras02/scala-bloging: https://thinky.tistory.com/category/Back-End/Scala
https://thinky.tistory.com/category/Back-End/Scala - Koras02/scala-bloging
github.com
728x90
LIST
'Back-End > Scala' 카테고리의 다른 글
| [Scala] 7장 컬렉션과 데이터 처리 (0) | 2025.08.26 |
|---|---|
| [Scala] 6장 - 에러 처리 (1) | 2025.08.18 |
| [Scala] 5장 - 패턴 매칭 & Case 클래스 (4) | 2025.08.14 |
| [Scala] 4장 - 함수형 프로그램 (FP) 패러다임 (0) | 2025.08.12 |
| [Scala] 3장 - 객체지향 프로그래밍(OOP) (1) | 2025.08.09 |