모노 및 플럭스
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는 이러한 리액터 유형을 사용하여 비동기적으로 실행되는 작업을 처리하여 더 나은 성능과 확장성을 제공합니다.