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
  • 구성요소
  • Dispatcher
  • Store
  • Action
  • View
  • 데이터 플로우
  1. React

Flux

PreviousHandling EventNextVagrant

Last updated 7 years ago

Flux는 데이터 플로우를 관리하는 하나의 패턴이다. flux가 가지고 있는 가장 중요한 특징은 flux의 데이터 플로우는 단방향이라는 점이다.

구성요소

Dispatcher

디스패쳐는 액션을 받아 그것을 등록되어있는 스토어들에게 뿌려주는 역할을 수행한다. 모든 스토어는 빠짐없이 모든 액션을 받게 된다. 각 어플리케이션당 하나의 싱글톤 디스패쳐 객체만이 존재한다.

Store

스토어는 어플리케이션에서 사용하는 데이터를 가지고 관리한다. 스토어는 어플리케이션의 디스패쳐에 자기 자신을 등록해야한다. 왜냐하면 그렇게 해야만 액션을 받을 수 있게 되기 때문이다. 스토어에 저장되어있는 데이터는 액션에 의해서만 수정되도록 주의해야한다. 그 외의 다른 이유로 스토어의 데이터가 수정되어서는 안 된다. 따라서 setter 메소드는 주어져선 안되고, 오직 getter만 주어져야 한다. 스토어는 액션을 받고, 원하는 액션에 대해서만 반응한다. 여기서 또 주의할 것이 하나 있다. 스토어의 데이터에 변경이 일어났을 땐 무조건 "change" 이벤트를 뿌려야 한다. 스토어는 하나의 어플리케이션에 무수히 존재할 수 있다.

Action

액션은 어플리케이션 내부에서 사용하는 일종의 API라고 볼 수 있다. 어플리케이션과 유저 간에 일어나는 모든 상호작용이 바로 액션이다. 액션은 간단한 자바스크립트 객체로 'type' 필드와 그 외의 여러 데이터 필드들을 가질 수 있다.

액션은 상세 구현보다 좀 더 추상화한 개념의 이름을 붙여야 된다. 가령 예를 들어 로그인 액션이 존재한다고 하면 이 액션의 type은 'create-user-session', 'get-user-info' 따위가 아니라 'login-user' 처럼 모두 포괄할 수 있는 이름이어야 한다. 이유는 다음과 같다. 앞서 모든 스토어가 모든 액션을 받는다고 했는데, 같은 액션이라도 스토어에 따라서 실질적으로 수행하는 작업이 달라질 수 있기 때문이다. 위에서 말한 예제에 맞춰서 생각해보자. 만약 'login-user' 액션이 각 스토어들에게 뿌려진다면 session 스토어는 액션에 대응해서 새로운 유저 세션을 만들 것이고, user 스토어는 해당 유저 데이터를 서버에서 받아올 것이다.

View

스토어에서 가지고 있는 데이터를 보여주는 역할. 뷰는 무슨 프레임워크를 쓰든 사실 상관 없다. 물론, 보통 flux를 쓰는 입장이라면 react를 쓰고 있을 확률이 높긴 하다. 스토어에 있는 데이터를 사용하기 위해 뷰는 스토어의 'change' 이벤트를 subscribe 해야 한다. 이렇게 해야 뷰는 스토어의 데이터가 변경되었다는 것을 감지하여 새로운 데이터를 바탕으로 다시 렌더링할 수 있게 된다. 만약에 스토어의 데이터를 바로 끌어다 쓰고 이벤트를 subscribe하지 않는다면 미묘한 버그들이 발생할 수 있다. 뷰에서 유저와 상호작용이 일어남에 따라 보통 액션은 뷰에서 디스패쳐로 전해지기 마련이다.

데이터 플로우

  1. 뷰에서 어떤 액션이 디스패쳐로 전해진다.

  2. 디스패쳐는 해당 액션을 모든 스토어로 뿌린다.

  3. 스토어는 액션을 보고 정해진 동작을 수행하여 만약 데이터에 변경이 생겼다면 뷰에게 이것을 전파한다.

물론, 위에서 보다시피 액션은 항상 뷰에서 시작하는 것은 아니고 다른 원인으로 시작할 수도 있다. 그러나 보통은 뷰에서 시작되기 마련이다.