개발 언어/기타 웹개발 지식
리액티브 프로그래밍 - 부록1. (`map` vs `flatMap`)
jjiiiinn
2024. 11. 14. 11:25
728x90
map
과 flatMap
의 차이점
- map
map
은 기존 데이터를 다른 형태로 동기적으로 변환합니다. 단순히 값을 변환하거나 가공할 때 사용됩니다.- 반환되는 타입은
Mono
나Flux
가 아닌 일반 객체여야 합니다.
- 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