(WebFlux) switchIfEmpty란 무엇입니까?

SwitchIfEmpty란 무엇입니까?

switchIfEmpty() 방법은 모노나 플럭스의 값이 출력되지 않는 경우 대신 다른 모노나 플럭스를 출력할 수 있도록 하는 방법입니다.

즉, 모노 또는 플럭스가 비어 있는 경우 다른 모노 또는 플럭스를 반환하여 기본값 또는 대체 값을 제공할 수 있습니다.

Mono<User> userMono = userRepository.findById(id)
                .switchIfEmpty(Mono.error(new UserNotFoundException("User not found with id: " + id)));

위의 예를 통해 알아봅시다.

예를 들어 사용자 검색 API에서 ID는 ID이 ID를 가진 사용자를 검색할 때 이 ID를 가진 사용자가 없으면 Mono.error() 로 UserNotFoundException 예외가 발생할 수 있습니다.

그러나 이 예외가 발생하면 HTTP 응답으로 500 Internal Server Error가 반환됩니다.

이것을 방지하기 위해 switchIfEmpty() 사용 방법 모노.오류() .대신, 모노.빈()Mono가 비어 있음을 나타내므로 HTTP 응답에서 404 Not Found를 반환합니다.

그러므로, switchIfEmpty() method는 Mono나 Flux에서 값이 반환되지 않으면 기본 값이나 대체 값을 반환할 수 있는 유용한 메서드입니다.

switchIfEmpty를 사용하지 않으면 어떻게 됩니까?

switchIfEmpty()mono 또는 flux가 비어 있으면 기본값 없이 반환되거나 사용하지 않으면 대체 값으로 반환됩니다.

이 경우 다음과 같이 모노 또는 플럭스가 비어 있음을 나타내는 값이 반환될 수 있습니다.

B. null 또는 빈 목록.

예를 들어, findById() 방법 모노인 경우 ID가 id인 사용자를 찾을 수 없으면 Mono를 반환합니다.

비어 있고 모노인 경우 null을 반환합니다.

NullPointer 예외그것은 일어날 수 있습니다

따라서 Mono일 때 대체 값을 반환하기 위해 switchIfEmpty()를 사용하는 것이 좋습니다.

비었다.

switchIfEmpty()를 사용하지 않는 다음 샘플 코드를 고려하십시오.

public Mono<User> getUserById(String id) {
    return userRepository.findById(id);
}

위의 코드에서 MonofindById() 메서드에 의해 반환된 값은 변경되지 않은 상태로 반환됩니다.

이때 아이디가 id인 사용자를 찾을 수 없다면 Mono 제로백. 따라서 이 코드를 switchIfEmpty()로 수정하여 Mono가 비었다.

테스트 코드 예

// switchIfEmpty() 메소드를 사용한 getUserById() 예제
public Mono<User> getUserById(String id) {
    return userRepository.findById(id)
            .switchIfEmpty(Mono.error(new UserNotFoundException("User not found with id: " + id)));
}

// switchIfEmpty() 메소드를 사용하지 않은 getUserById() 예제
public Mono<User> getUserById(String id) {
    return userRepository.findById(id);
}

// 테스트 코드
@Test
public void testGetUserByIdWithSwitchIfEmpty() {
    Mono<User> userMono = userService.getUserById("1");
    StepVerifier.create(userMono)
            .expectError(UserNotFoundException.class)
            .verify();
}

@Test
public void testGetUserByIdWithoutSwitchIfEmpty() {
    Mono<User> userMono = userService.getUserById("2");
    StepVerifier.create(userMono)
            .expectNextCount(0)
            .expectComplete()
            .verify();
}

위의 테스트 코드에서

testGetUserByIdWithSwitchIfEmpty()switchIfEmpty() 메서드 사용 getUserById() 메서드 테스트하다,

testGetUserByIdWithoutSwitchIfEmpty()switchIfEmpty() 메서드가 사용되지 않았습니다.

getUserById() 메서드 테스트하다

첫 번째 테스트에서 getUserById() 메소드 UserNotFound 예외 예외가 발생하도록 설정되어 있으므로
Mono가 예외를 발생시키는 것을 볼 수 있습니다.

두 번째 테스트에서 getUserById() 메서드는 대체 가치가 없음 왜냐하면,
Mono가 비어 있는 것을 볼 수 있습니다.

이 경우 모노에서 값이 출력되지 않으며 모노가 완전해야 합니다.