Spring WebFlux의 Project Reactor에서 리액티브 스트림의 에러 전파 및 처리를 위한 주요 연산자는 onErrorResume, onErrorReturn, doOnError이다. 이 연산자들은 스트림에서 에러가 발생했을 때 각각 다른 방식으로 에러를 처리하거나, 대체 시퀸스를 제공하거나, 부수 효과를 실행하는 데 사용된다.
에러가 발생했을 때 대체
Publisher를 제공하여 스트림을 복구한다.
이 연산자는 에러를 감지하고 지정된 시퀸스로 전환하여 에러로 인해 스트림이 종료되는 것을 막고 정상적으로 완료되도록 한다.
Mono.error(new RuntimeException())
.onErrorResume(throwable -> {
// 에러 로그를 남기거나 다른 작업을 수행
return Mono.just("대체할 값"); // 대체 값으로 스트림 복구
})
.subscribe(
value -> System.out.println("결과: " + value),
error -> System.out.println("에러: " + error.getMessage())
);
RuntimeException이 발생하면 onErrorResume이 Mono.just("대체할 값")를 반환하여 스트림을 복구하고 결과가 출력된다.onErrorResume의 람다 표현식 인자로 전달되는 Throwable객체를 활용하여 에러 타입을 구분할 수도 있다.public class Main {
public static void main(String[] args) {
Mono.error(new IllegalStateException("잘못된 상태입니다."))
.onErrorResume(throwable -> {
if (throwable instanceof IllegalArgumentException) {
return Mono.just("인자 에러 복구");
} else if (throwable instanceof IllegalStateException) {
return Mono.just("상태 에러 복구");
}
return Mono.just("기타 에러 복구");
})
.subscribe(
value -> System.out.println("결과: " + value)
);
}
}
에러가 발생했을 때 단일 대체값을 반환하여 스트림을 복구한다.
onErrorResume과 비슷하지만 새로운 Publisher대신 단일 값을 반환할 때 사용한다.
Mono.error(new RuntimeException())
.onErrorReturn("반환할 값") // 에러 발생 시 "반환할 값" 반환
.subscribe(
value -> System.out.println("결과: " + value),
error -> System.out.println("에러: " + error.getMessage())
);
onErrorResume예시와 동일한 결과가 나온다.public class Main {
public static void main(String[] args) {
Mono.error(new IllegalArgumentException("잘못된 인자입니다."))
.onErrorReturn(IllegalArgumentException.class, "잘못된 인자 에러") // IllegalArgumentException만 처리
.onErrorReturn(IllegalStateException.class, "잘못된 상태 에러") // IllegalStateException만 처리
.onErrorReturn("알 수 없는 에러") // 다른 모든 예외 처리
.subscribe(
value -> System.out.println("결과: " + value)
);
}
}
에러 발생 시 부수 효과를 실행한다.
Mono.error(new RuntimeException())
.doOnError(throwable -> {
// 에러 로그 기록, 알림 발송 등
System.out.println("에러 발생: " + throwable.getMessage());
})
.subscribe(
value -> System.out.println("결과: " + value),
error -> System.out.println("에러: " + error.getMessage()) // 에러가 그대로 전파
);
doOnError는 에러를 처리하지 않고, 에러 메시지를 출력한 후 RuntimeException을 하류로 전파한다.subscribe의 onError람다가 호출된다.| 연산자 | 기능 | 스트림 복구 여부 | 주로 사용하는 목적 |
|---|---|---|---|
onErrorResume | 에러 발생 시 다른 Publisher로 전환 | 복구 가능 | 복잡한 대체 로직이나 비동기 대체 작업 |
onErrorReturn | 에러 발생 시 단일 값 반환 | 복구 가능 | 간단한 대체 값 제공 |
doOnError | 에러 발생 시 부수 효과 실행 | 복구 불가 | 에러 로깅, 모니터링, 알림 |