(WebFlux) Mono와 FLux란?


(WebFlux) Mono와 FLux란? 1

모노 및 플럭스

Mono와 Flux는 Spring WebFlux에서 리액티브 프로그래밍을 위해 제공되는 두 가지 기본 리액터 유형입니다.

현재 Mono는 하나의 항목만 분배하고 Flux는 여러 항목을 분배할 수 있습니다.

  • 모노: 0개 또는 1개의 요소를 방출할 수 있는 반응성 시퀀스입니다.

  • 흐름: 0개 또는 N개의 요소를 방출할 수 있는 반응성 시퀀스입니다.

반응형 프로그래밍에서는 비동기적으로 실행되는 작업을 스트림이라고 합니다.

Mono 및 Flux는 이러한 스트림을 처리하기 위한 리액터 유형이며 스트림에서 방출하는 값을 처리하는 데 유용합니다.

모노 및 플럭스 예

아래 예를 사용하여 모노와 플럭스를 살펴보겠습니다.

// Mono 예제
Mono.just("Hello, World!
") .subscribe(System.out::println); // Flux 예제 Flux.just("apple", "banana", "orange") .subscribe(System.out::println);

위의 코드에서 모노.저스트()그리고 흐름. 똑바로 () 하나의 메서드를 사용하여 한 번에 하나의 값을 반환하는 Mono와 여러 값을 반환하는 Flux를 볼 수 있습니다.

그리고 구독하기() 메서드를 사용하여 Mono 및 Flux에서 반환된 값을 구독합니다.

이때, System.out::println구독하는 Mono나 Flux가 발산하는 값을 출력하는 람다식입니다.

이제 더 복잡한 모노 및 플럭스 예제를 살펴보겠습니다.

이 샘플은 Spring WebFlux에서 MongoDB를 사용합니다.

사용자를 생성, 업데이트, 삭제하고 사용자 목록을 가져오는 API를 제공합니다.

UserService 클래스를 볼 수 있습니다.

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Mono<User> getUserById(String id) {
        return userRepository.findById(id)
                .switchIfEmpty(Mono.error(new UserNotFoundException("User not found with id: " + id)));
    }

    public Flux<User> getAllUsers() {
        return userRepository.findAll();
    }

    public Mono<User> createUser(User user) {
        return userRepository.save(user);
    }

    public Mono<User> updateUser(String id, User user) {
        return userRepository.findById(id)
                .flatMap(existingUser -> {
                    existingUser.setName(user.getName());
                    existingUser.setEmail(user.getEmail());
                    return userRepository.save(existingUser);
                })
                .switchIfEmpty(Mono.error(new UserNotFoundException("User not found with id: " + id)));
    }

    public Mono<Void> deleteUserById(String id) {
        return userRepository.deleteById(id);
    }
}

  • getUserById()
    getUserById() 메소드는 ID사용자가 있는 곳의 사용자를 찾아 모노로 반환합니다.


    해당 아이디를 가진 사용자가 없는 경우 switchIfEmpty() 사용 방법 UserNotFound 예외 예외를 던지다
  • getAllUsers()
    getAllUsers() 메서드는 모든 사용자를 검색하고 Flux에 반환합니다.

  • 사용자 생성()
    createUser() 메서드는 새 사용자를 생성하고 이를 Mono로 반환합니다.

  • 업데이트 사용자()
    updateUser() 메서드에는 ID가 있습니다.

    ID인 사용자를 찾아 업데이트하고 모노로 반환합니다.


    이 아이디를 가진 사용자가 없다면, switchIfEmpty() 사용 방법 UserNotFound 예외 예외를 던지다
  • deleteUserById()
    deleteUserById() 메서드는 ID가 id인 사용자를 삭제하고 Mono로 반환합니다.

    반품.

위의 코드에서 UserService 클래스는 Mono 및 Flux를 사용하여 비동기적으로 실행되는 작업을 처리합니다.

즉, 사용자 목록 가져오기, 사용자 생성, 사용자 업데이트 및 사용자 삭제와 같은 작업은 모두 Mono 또는 Flux를 사용하여 비동기적으로 처리됩니다.

따라서 Mono와 Flux는 리액티브 프로그래밍에서 매우 유용한 리액터 유형입니다.

Spring WebFlux는 이러한 리액터 유형을 사용하여 비동기적으로 실행되는 작업을 처리하여 더 나은 성능과 확장성을 제공합니다.