Spring Web Flux : Reactive

스프링캠프 2017 에서 Toby 님이 발표한 Spring Web Flux 의 다음 내용을 정리한다.

  • WebFlux 를 사용하며 개선할 포인트
  • Data Access Repository
  • Non Blocking API call

Blocking IO

WebFlux 를 사용하는데, 서비스 로직에서 Blocking IO 가 사용되는 코드가 많으면 성능이 오히려 나빠질 수 있다.

개선할 blocking IO 는 다음과 같은 것들이 있다.

  1. data access repository 를 호출
  2. HTTP API 호출
  3. 기타 네트워크를 이용하는 서비스

JDBC 기반 RDB 연결

JDBC API 는 아쉽게도, Blocking 메서드로 점철되었다.
이 부분을 다음과 같이 개선해서, 서블릿 스레드를 점유하지 않도록 만들 수 있다.

  • @Async 비동기를 적용해서,
  • CompletableFuture 리턴하게 하여
  • 서블릿 스레드만 빨리 스레드풀에 리턴하게 함으로써 가용한 자원으로 만들 수 있다.

예를 들어,
repository 의 메서드에 다음과 같이 @Async 를 붙인다.

Read more

Spring Web Flux : @MVC

스프링캠프 2017 에서 Toby 님이 발표한 Spring Web Flux 의 다음 내용을 정리한다.

  • annotation 방식의 @MVC 와 유사한 WebFlux 개발 방법

@MVC WebFlux : 01

annotation 방식의 @MVC 방식과 유사하면서
비동기 + 논블러킹 리액티브 스타일의 코드 작성이 가능하다.

1
2
3
4
5
6
7
@RestController
class MyController {

@GetMapping("hello/{name}")
fun hello(request: ServerRequest): Mono<ServerResponse> =
ok().body(fromObject(request.pathVariable("name")))
}
  • 요청 정보가 미리 바인딩되지 않아, ServerRequest.pathVariable() 로 가져온다.
  • 응답은, Mono 에 감싸진 ServerResponse 를 응답한다.
  • 상태 코드와 바디를 명시적으로 선언한다.

@MVC WebFlux : 02

위 코드는, 더 이전 스타일로 표현 가능하다.
가장 대표적인 @MVC WebFlux 작성 방식이다.

1
2
3
@GetMapping("hello/{name}")
fun hello(@PathVariable name: String): Mono<String> =
Mono.just("Hello $name")
  • 파라미터 바인딩을 MVC 방식 그대로 한다.
  • 그리고, 핸들러 로직의 결과를 Mono/Flux 타입으로 리턴한다.
Read more

Spring Web Flux : Functional

스프링캠프 2017 에서 Toby 님이 발표한 Spring Web Flux 의 다음 내용을 정리한다.

  • 함수형 스타일의 WebFlux 가 웹 요청을 처리하는 방식
  • 함수형 스타일의 WebFlux 장/단점

Spring 이 웹 요청을 처리하는 방식

다음 순서로 진행된다.

  1. 요청 매핑
    웹 요청을 어느 handler 에게 보낼지 결정한다. MVC 에서는 @RequestMapping 을 이용한다.

  2. 요청 바인딩
    handler 에 전달할 웹 요청을 준비한다.
    (URL Path, Header, Cookie 정보를 가져옴, body 의 json 을 자바 오브젝트로 바인딩…)

  3. 핸들러 실행
    전달 받은 요청 정보를 이용해 로직을 수행한다.

  4. 핸들러 결과 처리
    handler 의 return 값으로 웹 응답으로 변환한다.

전통적인 방식의 다음 코드를 보자.

1
2
3
4
5
6
7
8
@RestController
class MyController {

@GetMapping("hello/{name}")
fun hello(@PathVariable name: String): String {
return "Hello $name"
}
}

@GetMapping 을 통해 요청을 매핑하고, @PathVariable 을 통해 요청을 바인딩한다.
그리고, return “Hello $name” 에서 핸들러를 실행하고 결과를 처리한다.

참고로,

  • 기존에는 @RequestMapping 과 메서드 타입을 사용했는데, Spring 4.xx 에서 @GetMapping, @PostMapping.. 이 등장했다.
  • 또한, @RestController 이므로 response body 에 문자열이 그대로 들어간다.
  • 특별한 Content-Type 을 지정하지 않으면, text/plain 으로 지정된다.
Read more

Spring Web Flux : 소개

스프링캠프 2017 에서 Toby 님이 발표한 Spring Web Flux 의 다음 내용을 정리한다.

  • WebFlux 사용 이유
  • WebFlux 개발 방식
  • WebFlux 의 주요 특징

사용 이유

Thread, CPU, Memory 등 자원을 낭비하지 않고 더 많은 요청을 처리할 수 있는 고성능 Web Application 을 만들 수 있다.
이런 부분에서 효율성을 극대화할 수 있는 경우는, 서비스 간 호출이 많은 Microservice Architecture 가 있다.

개발 방식

두 가지 개발 방식을 지원한다.

  1. 기존의 @MVC 방식 : @Controller, @RequestMapping 등 annotation 을 사용한다.
  2. 함수형 모델 : annotation 에 의지하지 않고, RouterFunction 과 HandlerFunction 를 사용한다.

주요 특징

  1. Servlet 기반이 아니다. (서블릿 지원하는 컨테이너에서 동작할 수 있게 호환성은 가지고 있음)
  2. ServerRequest, ServerResponse 을 사용한다. (HTTP Request, Response 를 추상화한 새로운 모델)

지원하는 웹 서버 컨테이너

Read more

람다

코틀린의 람다에 대해 정리한다.

람다 소개

아래와 같은 내용을 코드로 적용하려면 어떻게 해야할까 ?

  • 이벤트가 발생하면 이 Handler 를 실행하자
  • 모든 원소에 이 연산을 적용하자

자바에서는 무명 내부 클래스를 사용해, 클래스를 선언하고 그 클래스의 인스턴스를 함수에 넘길 수 있다.
함수형 프로그래밍에서는 함수를 직접 다른 함수에 전달할 수 있다.

자바의 다음 예를 보자.

1
2
3
4
5
6
button.setOnClickListener(new onClickListener(){
@Override
public void onClick(View view){
// event when clicked
}
});

무명 내부 클래스를 선언해서, 코드가 번잡하다.
코틀린에서는, 자바 8 과 마찬가지로 람다를 사용할 수 있다.

1
button.setOnClickListener { /* event when clicked */ }

람다와 컬렉션

Read more