Flamme Dev
  • IntroduceMyself
  • GOAL
    • 2021년 목표
    • 회고록
      • 2020년
  • COMMON
    • 자료구조
      • 시간복잡도
      • 스택/큐
    • 코드리뷰/스터디/세미나
      • Semina
        • Version control -1 (SVN/GIT)
        • Version control - 2 (GIT)
        • PostMan
        • JMeter
      • 스터디
        • 2021년
          • EffectiveKotlin
          • 이펙티브자바
        • 2020년
          • JPA Study
            • Chap1
            • Chap3
            • Chap4
            • Chap5
            • Chap6
            • Chap7
            • Chap8
            • Chap9
            • Chap10 -1
            • Chap10-2
            • Chap10-3
            • Chap12
            • Chap 13. 웹 애플리케이션과 영속성 관리
            • Chap14
      • 코드리뷰
        • Page 1
        • 개발 생각
        • APNs 라이브러리 교체
        • 파일 삭제 분투기
        • 신입 코드리뷰
          • 2020-09-02
          • 2020-09-03
          • 2020-09-10
        • Repository
          • Repositroy(20201124)
          • Repositroy(20201123)
          • Repositroy(20201120)
          • Repositroy(20201119)
          • Repositroy(20201117)
    • 개발 서적 / 동영상 강의
      • 동영상 강의
        • 진행 중
        • 완주한 것
      • 개발 서적
        • 읽은 것
          • 손에 잡히는 10분 SQL
            • 인덱스
            • 정리 본
        • 진행 중
          • 폴리글랏 프로그래밍
          • DDD-START
            • Chapter5 리포지터리의 조회 기능
            • Chapter4 리포지터리와 모델 구현
            • Chapter3 애그리거트
            • Chapter2 아키텍쳐 개요
            • Chapter1 도메인 모델의 시작
  • INFO
    • 유스콘 준비
    • intellij
      • Command line is too long.
    • 프로그래밍의 종류
      • Async Await
      • Reactive Programming
      • Imperative Programming
      • Functional Programming
        • Naver D2 함수형 프로그래밍 강의
      • Object Oriented Programing
        • 객체지향에 대해서 알아보는 영상
      • ProcedureOriented Programming
      • RX(ReactiveX)
      • OOP VS FP
      • Declarative Programming
    • Language
      • Kotlin
        • 박재성님 강의
        • Kotlin Spring CGLIB Error
        • Kotlin의 사용
        • coroutine
        • Kotlin JVM
      • JavaScript
      • JAVA
        • DefaultNonnull
        • effective78
        • Exception
        • JsonUnWrappers
        • 명명짓기
        • @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
        • Enc Key
        • ServiceLoader
        • Annotation
        • JVM(Java Virtual Machine)
        • Java8
          • Functional 사용
          • Optional
          • Invalid Key size
        • Java13
          • Text Block
        • Basic
          • Generic
          • JVM
          • Interface, Implements
    • Framework
      • NodeJs
      • Xamarin
      • Vert.x
        • vert.x in action
        • eventbus
      • blockedthreadchecker
      • Why.. not root run..
      • Spring
        • Spring Test
        • Kotlin
        • ControllerAdvice 정리
        • JsonAnnotation
        • Spring Data R2DBC
        • SpringWebFlux
          • login
          • SpringWebFlux란?
        • JPA
          • QueryDSL 객체 주소값 확인할 것
          • SpringData-JPA에서 Save, SaveAll
          • @CompositeKey에 ManyToOne JoinColumn이 있을 경우
          • QueryDSL N+1 문제(@OneToOne)
          • QueryDSL설정
          • CreationTimestamp
          • Enum(@enumerated vs @convert)
        • SpringSecurity
          • aopAlliance
          • csrf 방어
          • antMatcher vs mvcMatcher
          • SpringSecurity를 왜 써야할까?
          • CoreSpringSecurity
            • AuthenticationProvider
            • AuthenticationManager
            • Authentication Flow
            • SecurityContextPersistenceFilter
            • SecurityContextHolder, SecurityContext
            • Authentication
            • 필터 초기화와 다중 보안 설정
            • DelegatingProxyChain, FilterChainProxy
            • 사이트 간 요청 위조 - CSRF, CsrfFilter
            • 예외 처리 및 요청 캐시 필터 : ExceptionTranslationFilter, RequestCacheAwareFilter
            • 인가 API - 권한 설정 및 표현식
            • SessionManagementFilter, ConcurrentSessionFilter
            • 동시 세션 제어 / 세션고정보호/ 세션 정책
            • AnonymousAuthenticationFilter
            • RememberMeAutheticationFilter
            • Logout,LogoutFilter
            • UsernamePasswordAuthenticationFilter
            • Form인증
            • 인증 API - 사용자 정의 보안 기능 구현
            • 인증 API - 스프링 시큐리티 의존성 추가
        • SpringMVC
          • Spring Bean Q&A
          • HttpServletRequest
          • @ControllerAdvice
          • Service와 ServiceImpl은 꼭 있어야할까?
          • SpringMVC-1
          • SpringMVC - validator와 Errors
          • SpringMVC - DispatcherServlet의 URL
          • Spring MVC - 기본설정(2) 및 HandlerInterceptor
          • SpringMVC-3
          • Spring MVC - ViewResolver
          • Spring MVC - XML/JSON
          • Spring MVC - Field Injection & Constructor Injection
        • SpringEtc
          • Transactional
          • @Atowired NullPointer
          • CircleReference
          • Mybatis
            • IBatis - sql에 Map
            • 1:1 Mapping시 Null
            • auto_Increment, selectKey
          • @Transactional
          • JacksonAnnotation
        • SpringAOP
        • SpringDI
    • Server
      • PM2
      • Tomcat
        • jks
        • Virtual Host(Port)
    • OS
      • Window
        • Active directory
      • IOS
      • Linux
        • samba/keroberos
        • Linux
          • unlimit / socket backLog
          • nohup
          • ; , & , &&, {}
          • 쉘
          • rc.local
          • ps aux | grep 프로세스이름
          • Vim
          • Su, Sudo
          • File Directory
        • IdConfig
        • 유용한 커맨드
        • 리눅스 대소문자
        • 소프트링크와 하드링크의 차이
        • ln -Tfs
        • //와 / 의 차이
        • Linux(202003)
          • rm
          • diff
          • cp
          • mv
          • tar 압축 시 어떻게 심볼릭 링크도 같이 압축할까?
          • tar 명령어
          • ln -s 심볼릭 링크
    • Network
      • API Architectural Styles
      • 포트 확인
      • HeartBeat Protocol
      • SSO(Single Sign On)
      • Cookie and Session
      • Tcp HandShake
      • WireShark
        • WireShark 옵션
        • WireShark 패킷분석
    • DataBase
      • DB락에 대해서 알아보기
      • Redis
      • MYSQL
        • Mysql TimeOut 설정
        • MysqlLog
        • SlowQuery Analyzing
        • PushNotification Stress Test
      • MSSQL
      • 데이터베이스 식별자 선택 전략
    • ETC
      • 이름 짓기
      • FFProbe
      • Talk
      • Untitled
Powered by GitBook
On this page
  • Spring WebFlux?
  • Reactive Programming이란?
  • Spring WebFlux로 SpringBoot Application 구현
  • Reactive Stream의 이해

Was this helpful?

  1. INFO
  2. Framework
  3. Spring
  4. SpringWebFlux

SpringWebFlux란?

이 글은 스프링 5.0 마이크로 서비스 책(라제시 RV)을 보고 쓴 흔적입니다.

Spring WebFlux?

Spring WebFlux를 알기전에 미리 reactive Programming에 대하여 알아야 한다.

Reactive Programming이란?

Reactive Stream 명세에 바탕을 두고 있다.

Reactive Stream 명세는 따로 떨어져 있는 컴포넌트 사이의 async stream 처리나 event Flow을 Non-Blocking 방식으로 처리하기 위한 문법을 정리한다.

Non-Blocking 방식이란 ?

I/O (Input / Output) 작업이 진행되는 동안 user process의 작업을 중단시키지 않는 방법이다. 이 경우 I/O의 진행시관과 관계가 없기 때문에 어플리케이션에서 작업을 오랜 시간 중지하지 않고도 I/O 작업을 진행할 수 있다. 그러나 반복적으로 시스템 호출이 발생하기 때문에 자원 낭비가 될 수 있다.

다시 원래대로 돌아와 Reactive Stream에는 sequence의 처리, 완료 알림, 실패 시 배압(backpressure) 적용 등이 추가 된다.

Backpressure이란?

배압이 지원되면 받는 쪽에서는 보내는 쪽에 얼마만큼의 데이터를 소화할 수 있는지 알릴 수 있다. 받는 쪽에서는 데이터가 처리될 준비가 됐을 때만 데이터를 받을 수 있다. Reactive Stream은 서로 다른 컴포넌트 사이에 서로 다른 스레드 풀을 다뤄야 할 때나 느린 컴포넌트와 빠른 컴포넌트를 통합할 때 많은 도움을 준다.

이렇게 Reactive Programming 원칙은 Spring framework 5의 webFlux에 들어있다.

즉, webFlux에서 callBack Method 를 사용하지 않고도 async, Non-Blocking Http server와 완전한 backpressure를 사용할 수 있다.

그리고 reactive programming의 진정한 힘을 제대로 사용하려면 reactive 구조체가 클라이언트에서 뒷단의 repository까지 전 구간을 흐를 수 있어야 한다.

Spring WebFlux로 SpringBoot Application 구현

  1. @Controller Annotation 사용.

  2. Java8 Functional Programming 사용

Reactive Stream의 이해

발행자(Publisher)

데이터의 소스를 갖고 있으며, 구독자(Subscriber)의 요청이 오면 데이터를 발행한다. --> 이때 subscribe는 등록만을 담당할 뿐이며, 어떤 결과도 반환하지 않는다.

구독자(Subscriber)

데이터 스트림을 소비하기 위해 발행자를 구독한다. 여러가지 이벤트에 대응하는 여러 메소드를 가지고 있다.

구독자의 모든 메소드는 콜백 등록, 메소드 그 자체는 데이터에 대해 아무런 반응도 하지 않는다.

구독(Subscription)

단 하나의 발행자와 단 하나의 구독자를 연결해주며, 그 둘 사에어사만 공유되고, 그 둘 사이의 데이터를 교환을 중재한다.

프로세서(Processor)

처리 단계를 나타내며 발행자 인터페이스와 구독자 인터페이스를 모두 상속한다. 프로세서는 발행자와 구독자 사이의 계약을 반드시 준수해야하며 발행자와 구독자를 연결해서 체이닝(chaining) 할 수 있다.

Mono, Flux

리액터에는 발행자 프로세서로 사용되는 두 개의 구현체(Mono, Flux)가 있다.

  • Mono : 0 또는 1개의 이벤트만 발행

  • Flux : 0 또는 N개의 이벤트를 발행

    • 플럭스는 다수의 데이터 요소 또는 값의 리스트를 스트림으로 전송할 때 사용한다.

RabbitMQ, Kafka

발행자와 구독자 사이에 메시지 queue에 대한 처리를 하기 위함.

https://www.slideshare.net/arawnkr/reactive-web-servlet-async-nonblocking-io-73838876

PreviousloginNextJPA

Last updated 4 years ago

Was this helpful?

Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까? | Ahea Team Study Blog
Going Reactive with Spring, Coroutines and Kotlin Flowspringcentral
Logo
Logo