에러 전파 및 처리를 위한 연산자

김기현·2025년 8월 16일

Spring WebFlux

목록 보기
26/28

Spring WebFlux의 Project Reactor에서 리액티브 스트림의 에러 전파 및 처리를 위한 주요 연산자는 onErrorResume, onErrorReturn, doOnError이다. 이 연산자들은 스트림에서 에러가 발생했을 때 각각 다른 방식으로 에러를 처리하거나, 대체 시퀸스를 제공하거나, 부수 효과를 실행하는 데 사용된다.


onErrorResume

에러가 발생했을 때 대체 Publisher를 제공하여 스트림을 복구한다.

이 연산자는 에러를 감지하고 지정된 시퀸스로 전환하여 에러로 인해 스트림이 종료되는 것을 막고 정상적으로 완료되도록 한다.

Mono.error(new RuntimeException())
    .onErrorResume(throwable -> {
        // 에러 로그를 남기거나 다른 작업을 수행
        return Mono.just("대체할 값"); // 대체 값으로 스트림 복구
    })
    .subscribe(
        value -> System.out.println("결과: " + value),
        error -> System.out.println("에러: " + error.getMessage())
    );
  • 위 예시에서 RuntimeException이 발생하면 onErrorResumeMono.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)
            );
    }
}

onErrorReturn

에러가 발생했을 때 단일 대체값을 반환하여 스트림을 복구한다.

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)
                );
    }
}

doOnError

에러 발생 시 부수 효과를 실행한다.

  • 이 연산자는 스트림의 에러를 처리하거나 복구하지 않고, 에러를 그대로 전파한다.
  • 주로 에러 로깅이나 모니터링 등의 목적으로 사용한다.
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을 하류로 전파한다.
  • 그리고 subscribeonError람다가 호출된다.

세 연산자의 차이점 요약

연산자기능스트림 복구 여부주로 사용하는 목적
onErrorResume에러 발생 시 다른 Publisher로 전환복구 가능복잡한 대체 로직이나 비동기 대체 작업
onErrorReturn에러 발생 시 단일 값 반환복구 가능간단한 대체 값 제공
doOnError에러 발생 시 부수 효과 실행복구 불가에러 로깅, 모니터링, 알림
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글