개발 언어/기타 웹개발 지식

리액티브 프로그래밍 - 부록1. (`map` vs `flatMap`)

jjiiiinn 2024. 11. 14. 11:25
728x90

mapflatMap의 차이점

  1. map
    • map은 기존 데이터를 다른 형태로 동기적으로 변환합니다. 단순히 값을 변환하거나 가공할 때 사용됩니다.
    • 반환되는 타입은 MonoFlux가 아닌 일반 객체여야 합니다.
  2. flatMap
    • flatMap은 기존 데이터를 다른 형태로 변환하면서, 변환 결과가 Mono 또는 Flux 같은 비동기 타입일 때 사용합니다.
    • 주로 비동기 연산이 필요할 때 사용되며, Mono<Mono<T>>와 같은 중첩된 비동기 타입이 아닌 Mono<T>로 결과를 평평하게 "펼쳐"줍니다.

예제 1: map을 사용한 동기적 변환

import reactor.core.publisher.Mono

fun main() {
    val userMono = Mono.just("john.doe@example.com")
        .map { email -> email.uppercase() } // 이메일을 대문자로 변환
        .map { email -> "User Email: $email" } // "User Email: ..." 형식으로 변환

    userMono.subscribe { println(it) }
}

설명

  • Mono.just("john.doe@example.com"): 이메일 문자열을 Mono로 감쌉니다.
  • .map { email -> email.uppercase() }: 이메일 문자열을 대문자로 변환합니다.
  • .map { email -> "User Email: $email" }: 결과 문자열을 "User Email: ..." 형식으로 변환합니다.

출력:

User Email: JOHN.DOE@EXAMPLE.COM

여기서 map은 동기적으로 단순한 변환을 처리합니다.

예제 2: flatMap을 사용한 비동기적 변환

import reactor.core.publisher.Mono

fun main() {
    val userMono = Mono.just("john.doe@example.com")
        .flatMap { email -> fetchUserByEmail(email) } // 비동기적으로 외부 API에서 사용자 정보를 가져옴
        .map { userInfo -> "User Info: $userInfo" }

    userMono.subscribe { println(it) }
}

fun fetchUserByEmail(email: String): Mono<String> {
    // 외부 API 호출을 모방하는 비동기 작업
    return Mono.just("User(name=John Doe, email=$email)")
}

설명

  • .flatMap { email -> fetchUserByEmail(email) }: 비동기 함수 fetchUserByEmail을 호출합니다. 이 함수는 Mono<String>을 반환하므로, 결과를 Mono로 감싸 비동기적으로 처리됩니다.
  • fetchUserByEmail(email)에서 외부 API 호출처럼 사용자의 이름과 이메일 정보를 비동기로 가져오는 작업을 모방합니다.

출력:

User Info: User(name=John Doe, email=john.doe@example.com)

map과 flatMap의 비교 요약

  • map은 데이터를 단순 변환할 때 사용되며, 결과가 동기적으로 반환됩니다.
  • flatMap은 비동기 작업을 수행할 때 사용되며, 비동기 결과를 평평하게 만들어줍니다.
728x90