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 RestController 및 WebClient 외에도 WebFlux 프레임워크는 Reactive Streams의 소켓 스타일 스트리밍을 위해 반응형 WebSocket 및 해당 WebSocketClient 도 지원합니다.
자세한 내용은 Reactive WebSocket with Spring 5 작업에 초점을 맞춘 자세한 기사도 있습니다 .
마지막으로 이 기사에서 사용된 전체 소스 코드는 Github에서 사용할 수 있습니다 .