@RestController
Spring Framework에서 제공하는 어노테이션 중 하나로, RESTful 웹 서비스를 개발할 때 사용된다. @RestController 어노테이션이 붙은 클래스는, HTTP 요청을 처리하고, JSON, XML 등의 데이터를 반환하는 RESTful API를 개발할 수 있다. 이때, @RestController 어노테이션은 @Controller 어노테이션과 @ResponseBody 어노테이션을 합친 것과 같은 역할을 수행한다.
@RestController
@RequestMapping("/api")
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
@GetMapping("/greet/{name}")
public String greet(@PathVariable String name) {
return "Hello, " + name + "!";
}
}
위 코드에서 @RestController 어노테이션이 붙은 MyRestController 클래스는, "/api" 경로를 사용하는 RESTful API를 개발한다. @GetMapping 어노테이션을 사용하여 HTTP GET 요청에 대한 메서드를 정의하고, @PathVariable 어노테이션을 사용하여 경로 변수를 처리한다. 따라서, "/api/hello" 경로로 GET 요청을 보내면 "Hello, World!"라는 응답을 반환하고, "/api/greet/{name}" 경로로 GET 요청을 보내면 "Hello, {name}!"라는 응답을 반환한다.
produces = MediaType.TEXT_EVENT_STREAM_VALUE
produces는 Spring Framework에서 제공하는 @RequestMapping 어노테이션의 속성 중 하나로, 클라이언트 요청에 대한 응답 데이터의 MIME 타입을 지정한다. "MediaType"는 Spring Framework에서 제공하는 클래스로, HTTP 요청 및 응답에 사용되는 미디어 타입을 지정한다. MediaType.TEXT_EVENT_STREAM_VALUE는 Server-Sent Events 방식으로 데이터를 전송하는 데 사용되는 MIME 타입이다. 즉, 위 코드에서 "produces" 속성에 MediaType.TEXT_EVENT_STREAM_VALUE 값을 지정함으로써, 해당 RESTful API에서 반환되는 데이터의 MIME 타입이 Server-Sent Events 방식으로 지정된다. 이를 통해 클라이언트가 해당 API를 호출할 때, 받게 될 데이터의 형식을 미리 알 수 있다.
@GetMapping(value = "/sender/{sender}/receiver/{receiver}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Chat> getMsg(@PathVariable String sender, @PathVariable String receiver) {
return chatRepository.mFindBySender(sender, receiver)
.subscribeOn(Schedulers.boundedElastic());
}
"subscribeOn" 메서드는 데이터 소스를 구독할 때 사용되며, 이를 통해 Flux 스트림의 모든 요소를 처리하기 위해 동시에 실행될 수 있는 새로운 스레드를 만들 수 있다. 이 경우, "boundedElastic" 스케줄러를 사용하여 새로운 스레드를 생성하며, 이 스케줄러는 적절한 수의 스레드를 생성하여 Flux 스트림 요소를 비동기적으로 처리한다. "boundedElastic" 스케줄러는 Reactor 라이브러리에서 기본으로 제공하는 스케줄러 중 하나로, CPU 코어 수에 비례하여 적절한 수의 스레드를 생성하는 것이 특징이다. 이를 통해 CPU 자원을 최대한 활용하며, 대규모 애플리케이션에서도 일관된 성능을 유지할 수 있다.