리액티브 마이크로서비스를 만들 때 어떤 오류도 정상적으로 처리해야 됩니다. 따라서 리액터 프레임워크는 이런 오류를 처리하기 위한 메커니즘을 제공합니다. 핸들러에서 오류 찾기 핸들러를 만들 때 오류가 발생할 수 있으며 이런 오류는 리액티브 게시자 onErrorResume에서 특별한 방법으로 처리 가능합니다. @Component class CustomerHandler(private val customerService: CustomerService) { ... fun create(serverRequest: ServerRequest) = customerService.createCustomer(serverRequest.bodyToMono()).flatMap { created(URI.create("/function..

RouterFunction 사용 클라이언트에서 오는 요청을 Controller로 대신 RouterFunction을 사용해 처리할 수 있습니다. @Component class CustomerRouter { @Bean fun customerRouters(): RouterFunction = router { "/functional".nest { } } } 새 컴포넌트로 생성했기 때문에 빈이 노출되면 컴포넌트 스캔을 통해 새로운 방식의 RouterFunction을 만들고 경로를 정의합니다. 위의 코드 같은 경우에는 /functional 경로의 모든 요청을 처리합니다. 코드를 아래와 같이 수정하였습니다. @Component class CustomerRouter { @Bean fun customerRouters():..
구독자와 게시자 리액티브 프로그래밍의 핵심 구성 요소에는 구독과 게시가 있습니다. 리액티브 프로그래밍은 이벤트가 감지되면 필요한 사용자에게 전송되는 이벤트 모델을 기반으로 합니다. UI에서 버튼을 누르는 것과 같은 이벤트를 수신하고자 할 때 정의하는 것이 구독자입니다. 반대로 이벤트를 생성하는 것이 게시자라고 생각하면 됩니다. 스프링에서는 리액터 프레임워크를 사용해서 리액티브 마이크로서비스를 만듭니다. 컨트롤러는 결과의 게시자가 될 수 있으며, 스프링은 서비스를 사용하는 모든 사용자에게 데이터를 보내기 위해 이벤트를 구독합니다. 이 데이터는 리액티브 스트림 사양에 정의된 대로 리액티브 스트림으로 전송돼 논블로킹의 배압을 제공합니다. Mono 리액터에서는 모노라는 클래스를 통해 하나의 결과를 보내는 게시자..

스프링 웹플럭스 프로젝트 만들기 넌리액티브 마이크로서비스를 마이그레이션하기 스프링 웹플럭스란? Netty라는 새 애플리케이션 서버를 사용해 리액티브 마이크로서비스를 만들 수 있는 컴포넌트입니다. 리액티브 스트림 패턴을 구현하기 위해 리액터 프레임 워크를 광범위하게 사용합니다. 스프링 웹플럭스 프로젝트 생성하기 https://start.spring.io/ 위와 같이 세팅을 하고 애플리케이션을 다운로드합니다. 이제 상단의 실행을 클릭하거나 Terminal에서 아래 작업을 실행합니다. mvnw spring-boot:run 그러면 실행이 되고 로그에 아래와 같이 표시되는 것을 확인하여 네티를 이용해 요청을 처리할 준비를 합니다. 네티 Netty는 넌블로킹 I/O 작업을 수행할 수 있게 하는 Client-Serv..
고객 정보를 찾을 수 없어서 {"error": "404 NOT FOUND"} 형태로 반환하는 예제입니다. JSON 없이 예외처리 { "id": 4, "name": "test", } 위와 같이 POST에 이상한 데이터를 넣거나 형식을 지키지 않으면 아래와 같이 스프링이 자동으로 예외 처리를 해줍니다. { "timestamp": "2020-09-08T03:12:11.418+00:00", "status": 400, "error": "Bad Request", "message": "", "path": "/customer" } 이때 @ControllerAdvice와 @ExceptionHandler 어노테이션을 사용해 예외 처리를 해줄 수 있습니다. @ControllerAdvice class ErrorHandler ..
data class에서 데이터의 기본 값을 null로 주면 val telephone: Telephone? = null 아래와 같이 데이터가 없을 땐 null값을 받게 됩니다. [ { "id": 1, "name": "im", "telephone" : null }, { "id": 2, "name": "leaf", "telephone": { "countryCode": "+82", "telephoneNumber": "56453423" } }, { "id": 3, "name": "imleaf", "telephone" : null } ] 이때 null이면 데이터를 표시하지 않으려면 아래와 같이 하면 됩니다. 1. Jackson 어노테이션 사용 @JsonInclude(JsonInclude.Include.NON_NUL..
200 OK 응답뿐만 아니라 404 NOT FOUND 등 다양한 상태 코드를 제공하도록 하기 위해 사용합니다. 예를 들어 아래 코드를 보면 됩니다. @GetMapping(value = ["/customer/{id}"]) fun getCustomer(@PathVariable id: Int) = ResponseEntity(customerService.getCustomer(id), HttpStatus.OK) GetMapping이 기본적으로 HttpStatus.OK를 수행합니다. 이것을 적절하게 바꿔보겠습니다. GET @GetMapping(value = ["/customer/{id}"]) fun getCustomer(@PathVariable id: Int) : ResponseEntity { val custome..