1. 개요

Spring 5에는 웹 애플리케이션에 반응형 프로그래밍 지원을 제공하는 Spring WebFlux가 포함되어 있습니다. 

이 사용방법(예제)에서는 반응형 웹 구성 요소 인 RestController  및  WebClient 를 사용하여 작은 반응형 REST 애플리케이션을 만듭니다 .

또한 Spring Security를 ​​사용하여 반응형 엔드포인트를 보호하는 방법도 살펴보겠습니다.

2. 스프링 웹플럭스 프레임워크

Spring WebFlux는 내부적으로 Project Reactor 와 해당 게시자 구현인 Flux  및  Mono 를 사용 합니다.

새 프레임워크는 두 가지 프로그래밍 모델을 지원합니다.

  • 어노테이션 기반 반응형 구성요소
  • 기능 라우팅 및 처리

다른 사용방법(예제)에서 라우팅 및 처리와 같은 기능적 스타일 을 이미 살펴보았으므로 어노테이션 기반 반응형 구성 요소에 중점을 둘 것  입니다.

3. 의존성

다른 모든 필수 의존성을 가져오는 spring-boot-starter-webflux 의존성 부터 시작하겠습니다 .

  • 기본 Spring Boot 애플리케이션 설정을 위한 spring -boot  및  spring-boot-starter
  • 스프링 웹플럭스  프레임워크
  •  리액티브 스트림에 필요한 리액터 코어 와 리액터 네티
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.6.4</version>
</dependency>

최신  spring-boot-starter-webflux 는 Maven Central에서 다운로드할 수 있습니다.

4. 반응형 REST 애플리케이션

이제 Spring WebFlux를 사용하여 매우 간단한 반응형 REST EmployeeManagement 애플리케이션을 빌드합니다.

  • 간단한 도메인 모델 사용 – ID이름 필드 가 있는 직원
  • RestController  로 REST API를 빌드하여 Employee 리소스를 단일 리소스 및 컬렉션으로 게시 
  • WebClient 로 클라이언트를 빌드 하여 동일한 리소스 검색
  • WebFlux 및 Spring Security 를 ​​사용하여 안전한 반응 엔드포인트 생성

5. 반응  형 RestController

Spring WebFlux는 Spring Web MVC 프레임워크와 동일한 방식으로 어노테이션 기반 구성을 지원합니다.

먼저 서버에서 Employee 리소스의 반응 스트림을 게시하는 어노테이션이 달린 컨트롤러 만듭니다 .

어노테이션이 달린 EmployeeController 를 만들어 보겠습니다  .

@RestController
@RequestMapping("/employees")
public class EmployeeController {

    private final EmployeeRepository employeeRepository;
    
    // constructor...
}

EmployeeRepository  는 비차단 반응 스트림을 지원하는 모든 데이터 저장소가 될 수 있습니다.

5.1. 단일 리소스

그런 다음 단일 Employee 리소스 를 게시하는 컨트롤러에 엔드포인트를 생성해 보겠습니다 .

@GetMapping("/{id}")
private Mono<Employee> getEmployeeById(@PathVariable String id) {
    return employeeRepository.findEmployeeById(id);
}

 최대 한 명의 직원을 반환하기 때문에 단일 직원 리소스를  Mono 로 래핑합니다.

5.2. 컬렉션 리소스

또한 모든 직원 의 컬렉션 리소스를 게시하는 엔드포인트를 추가합니다 .

@GetMapping
private Flux<Employee> getAllEmployees() {
    return employeeRepository.findAllEmployees();
}

컬렉션 리소스  의 경우 0. .n 요소 의 게시자이므로  Employee  유형 의 Flux 를 사용합니다.

6. 반응형 웹 클라이언트

Spring 5에 도입된 WebClient 는 반응형 스트림을 지원하는 비차단 클라이언트입니다.

EmployeeController  가 제공하는 Endpoints에서 데이터를 검색하는 클라이언트를 만들기  위해 WebClient 를 사용할 수 있습니다  .

간단한  EmployeeWebClient 를 만들어 보겠습니다 .

public class EmployeeWebClient {

    WebClient client = WebClient.create("http://localhost:8080");

    // ...
}

여기에서 우리는 팩토리 메서드 create 를 사용하여 WebClient 를 만들었습니다 . localhost:8080 을 가리  키 므로 이 클라이언트 인스턴스에서 호출하는 상대 URL을 사용할 수 있습니다.

6.1. 단일 리소스 검색

Endpoints  /employee/{id} 에서 Mono 유형의 단일 리소스를 검색하려면 다음을 수행합니다 .

Mono<Employee> employeeMono = client.get()
  .uri("/employees/{id}", "1")
  .retrieve()
  .bodyToMono(Employee.class);

employeeMono.subscribe(System.out::println);

6.2. 컬렉션 리소스 검색

마찬가지로 엔드포인트 /employees 에서 Flux 유형의 컬렉션 리소스를 검색하려면 다음을 수행합니다 .

Flux<Employee> employeeFlux = client.get()
  .uri("/employees")
  .retrieve()
  .bodyToFlux(Employee.class);
        
employeeFlux.subscribe(System.out::println);

WebClient 설정 및 작업 에 대한 자세한 기사도 있습니다 .

7. 스프링 웹플럭스 시큐리티

Spring Security를 ​​사용하여 반응형 엔드포인트를 보호할 수 있습니다.

EmployeeController  에 새 엔드포인트가 있다고 가정해 보겠습니다 . 이 Endpoints 은 직원 세부 정보를 업데이트하고 업데이트된 직원을 다시 보냅니다 .

이렇게 하면 사용자가 기존 직원을 변경할 수 있으므로 이 Endpoints을 ADMIN 역할 사용자로만 제한하려고 합니다.

결과적으로 EmployeeController 에 새 메서드를 추가해 보겠습니다 .

@PostMapping("/update")
private Mono<Employee> updateEmployee(@RequestBody Employee employee) {
    return employeeRepository.updateEmployee(employee);
}

이제 이 메서드에 대한 액세스를 제한하기 위해 SecurityConfig 를 만들고 ADMIN 사용자만 허용하도록 일부 경로 기반 규칙을 정의해 보겠습니다.

@EnableWebFluxSecurity
public class EmployeeWebSecurityConfig {

    // ...

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(
      ServerHttpSecurity http) {
        http.csrf().disable()
          .authorizeExchange()
          .pathMatchers(HttpMethod.POST, "/employees/update").hasRole("ADMIN")
          .pathMatchers("/**").permitAll()
          .and()
          .httpBasic();
        return http.build();
    }
}

이 구성은 /employees/update 엔드포인트에 대한 액세스를 제한합니다 . 따라서 역할 이 ADMIN 인 사용자만 이 Endpoints에 액세스하고 기존  직원을 업데이트할 수 있습니다.

마지막으로 @EnableWebFluxSecurity 어노테이션은  몇  가지 기본 구성으로 Spring Security WebFlux 지원을 추가합니다.

자세한 내용 은 Spring WebFlux Security 구성 및 작업 에 대한 자세한 기사도 있습니다 .

8. 결론

이 기사에서는 Spring WebFlux 프레임워크에서 지원하는 반응형 웹 구성 요소를 만들고 작업하는 방법을 살펴보았습니다. 예를 들어 작은 Reactive REST 애플리케이션을 구축했습니다.

그런 다음 RestController  및 WebClient  를 사용하여 반응형 스트림을 게시하고 사용하는 방법을 배웠습니다 .

또한 Spring Security의 도움으로 안전한 반응 엔드포인트를 생성하는 방법도 살펴보았습니다.

Reactive RestControllerWebClient 외에도 WebFlux 프레임워크는 Reactive Streams의 소켓 스타일 스트리밍을 위해 반응형 WebSocket  및 해당 WebSocketClient 도 지원합니다.

자세한 내용은 Reactive WebSocket with Spring 5 작업에 초점을 맞춘 자세한 기사도 있습니다 .

마지막으로 이 기사에서 사용된 전체 소스 코드는 Github에서 사용할 수 있습니다 .

HTTPClient footer