studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 토비님 강연
  • 사전 지식
  • 특징
  • 관련 API
  • 장점
  • WebFlux + Spring Mvc
  • 성능 개선?
  • + 알파
  1. Spring 관련 정리
  2. Spring Webflux

Tobi 강연

토비님 강연

사전 지식

  • 스프링은 DI가 런타임에 결정되므로 별도의 컨테이너가 있어야함 -> 3

  • 동기 비동기는 2+

    • 동기는 시간을 맞추고

    • 비동기는 시간을 안 맞추고

    • 중요한건 대상, 시간

    • A, B 시작시간 == 종료시간 -> 동기.

    • 멀티쓰레드라도 두 쓰레드가 동시에 작업을 시작하면 동기

    • 메소드 리턴 시간과 결과를 전달받는 시간이 일치하면 동기

    • A가 끝나는 시간과 B가 시작하는 시간이 같아도 동기

  • 블록킹, 논블록킹

    • 내가 직접 제어할 수 없는 대상을 상대하는 방법

    • IO, 네트워크, 멀티스레드 동기화 등

  • Servlet 3.0

    • 비동기 요청 처리

  • Spring 3.2부터 비동기 지원

  • CompletableFuture, CompletionStage

    • ListenableFuture의 개선인가?

  • 스프링 웹 처리

      • 리퀘스트 매핑 (라우팅): 어느 핸들러로 보낼지

      • 리퀘스트 바인딩: 핸들러에 전달할 argument 준비

      • 핸들러 실행: 로직 수행

      • 핸들러 리턴 결과로 응답 생성: response 생성 json 변환 뷰리졸버 등

특징

  • 서블릿 스택, API 벗어남

    • 리액티브 함수형하고 안 어울림

    • ServerRequest, ServerResponse

  • Reactor 스트림을 그대로 리턴하는게 가능

관련 API

  • RouterFunction

    • 리퀘스트를 바탕으로 어느 HandlerFunction이 처리할지 찾음 (디스패처?)

  • HandlerFunction

    • 리퀘스트를 처리해서 결과값 반환 (= 컨트롤러)

  • 좀 노드 js같기도

  • RouteFunctions.route(조건, HandlerFunction)

  • RouterFunction 등록

    • @Bean으로 만들기

    • 여러 조건을 and(), or() 등으로 엮을 수 있고

    • @RequestMapping을 클래스레벨로 걸고 메소드레벨로 걸던 것을 nest()로 중복되게 할 수 있고

장점

  • 어노테이션으로 감춰진 부분 없이 모든 웹 처리 과정을 명시적인 코드로 작성?

  • 함수 조합이라 추상화에 유리

  • 테스트 작성 편리

    • 모든 로직을 내가 처리하므로 단위테스트로 작성 가능

WebFlux + Spring Mvc

  • 그냥 어노테이션 기반 대부분 그대로 쓰고 값을 리턴할 때만 Reactor 클래스에 담아서 리턴해야됨

  • @RequestBody의 경우 Mono<T>, Flux<T> 안에 들어가있는 형식으로 받을 수도 있다.

    • HTTP Stream 스펙을 쓸 때, Flux<T>를 쓰면 스트리밍 형태로 계속 하나하나 받아서 리턴할 수도 있다.

  • @ResponseBody는 Mono, Flux, ServerSideEvent?

성능 개선?

  • DB 연결

    • JDBC API에 블로킹 메소드가 넘쳐나서 답이 없음

    • 일부 DB에 논블로킹 드라이버가 존재하지만 지원하지 않고 있음

    • 일단 지금 가능한건 쓰레드풀 관리를 효율적으로 하는 정도에 불과.

    • NoSQL은 Spring data reactive 로 만들어진걸 쓸 수 있음.

  • HTTP API

    • AsyncRestTemplate 사용

  • 중요한 것

    • WebFlux + 리액티브 레포지터리, API 호출, 지원하는 외부 서비스

    • 만약에 리액티브를 지원하지 않는 블록킹 API라면 @Async 써서 다른 쓰레드에서 돌도록. 이건 노드js랑 비슷하네.

+ 알파

  • 함수형 스타일 쓰고싶으면

  • 데이터 흐름에 다양한 오퍼레이터

  • 연산을 조합해서 추상회되어 동시성 정보를 노출하지 않음

  • 데이터 흐름의 속도 제어 가능

    • 이게 아마 백프레셔였던가...

PreviousSpring WebfluxNext코드 리팩토링

Last updated 7 years ago