SlideShare une entreprise Scribd logo
1  sur  180
Télécharger pour lire hors ligne
다같이!
FluxUtils
한바퀴
React를 사용해
진행했던 두 프로젝트
AJAX : SuperAgent
Pub/Sub : EventEmitter3
View: React
Router: page.js
React를 사용해
진행했던 두 프로젝트
AJAX : SuperAgent
Pub/Sub : EventEmitter3
View: React
Router: page.js
라이브러리만 조합해 협업할 때
발생하는 다양한 문제들
적당한 수준의 구조와
개발자 간 공통적으로 이해할 수
있는 규칙이나 철학 필요
React와 궁합이 좋은
Flux 계열을 한번 살펴보자!
“ ”
FluxUtils를 사용한 이유
약 3개월 전 JSer.info를 통해
플럭스유틸즈에 관해 알게 됐다.
그리고 다음과 같은 고민을
하게 됐다.
FluxUtils
ReduxFluxUtils
ReduxFluxUtils
클래스로 디자인 돼 있다. 함수로 디자인 돼 있다.
메서드로 reduce를 제공한다.
ReduxFluxUtils
ReduxFluxUtils
todo/complete 액션에 맞춰
상태를 변경하고 반환한다.
DELETE_TODO 액션에 따라
상태를 변경하고 반환한다.
ReduxFluxUtils
ReduxFluxUtils
“
”
두 라이브러리는 닮은 부분이 있다.
두 개발자는 웹 상에서 열정적으로 의견을 주고
받으며 서로에게 영향을 주고 있다.
https://goo.gl/3PDL8X https://goo.gl/iww0V9&
FluxUtils
페이스북의 웹 개발자 빌 피셔(Bill Fisher)가
개발해 제공하는 기본 유틸리티 클래스 집합
이벤트 중앙 허브 격인 「Dispatcher」만제공하는
처음과 달리 다양한 Store와 Container를
실체화해 제공
FluxStore FluxReduceStore FluxMapStore FluxContainer
Store의 기반클래스, EventEmitter를 의존하고
Dispatcher를 구독하여 Flux 아키텍처 흐름의 기본을 실현함“
”
FluxStore
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
FluxStore는 EventEmitter를
의존한다.
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
생성자를 통해 Dispatcher의
인스턴스를 주입받는다.
Dispatcher와 EventEmitter의
인스턴스를 프로퍼티로 설정한다.
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L15-L18
#L72-L82
Dispatcher의 register 메서드에
익명함수를전달해해당Dispatcher의
액션을 구독한다.
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L149-L155
#L28-L54
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L149-L155
#L28-L54
__onDispatch 메서드는 추상메서드다.
EventEmitter의 emit 메서드를 통해
자신의 상태 변화를 발행한다.
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L149-L155
#L28-L54
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L130-L137
#L28-L54
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
#L130-L137
#L28-L54값이 변경되면 __emitChange 메서드를
호출해 __changed 프로퍼티를 true로
설정한다.
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
DispatcherFluxStore
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
DispatcherregisterFluxStore
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
addListener
FluxContainer
DispatcherregisterFluxStore
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
addListener
Component
FluxContainer
DispatcherregisterFluxStore
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
addListener
Component
FluxContainer
DispatcherregisterFluxStore
render
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
FluxContainer
FluxStore
Component
Dispatcher
FluxStore
Action
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
FluxContainer
FluxStore
Component
Dispatcher
FluxStore
AjaxAction
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
FluxContainer
FluxStore
Component
Dispatcher
FluxStore
AjaxAction
dispatch
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
FluxContainer
FluxStore
Component
payload
FluxStore
Ajax
Dispatcher
Action
dispatch
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
FluxContainer
FluxStore
Component
Dispatcherpayload
emit
FluxStore
AjaxAction
dispatch
FluxStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxStore.js)
FluxContainer
rerender
FluxStore
Component
Dispatcherpayload
emit
AjaxAction
dispatch
Store를 상속한 클래스
Redux와 비슷한 reduce 메서드 지원“
”
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L22-L45
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L22-L45
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L22-L45
생성자에서 getInitialState 메서드를
호출한다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L22-L45
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L22-L45
getInitialState는 추상 메서드로 구체
클래스에서 정의해야한다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
Dispatcher의 액션을 전달 받는 메서드가
재정의 돼 있다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
reduce 메서드를 호출한다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
reduce 메소드 역시 추상 메서드로
구체 클래스에서 정의해야한다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L66-L71
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L66-L71
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L66-L71
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L66-L71
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L66-L71
다음과 같은 형태로 정의될 수 있다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
기존의 상태 값과 reduce의 결과 값
이 다른지 비교한다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
다르다면 값을 변경한다.
__emitChange 메서드를 호출해
__changed 프로퍼티를 true로 변경한다.
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
FluxReduceStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxReduceStore.js)
#L47-L94
최종적으로 emit 하여 상태 변화를 구독자
에게 알린다.
FluxReduceStore
“
”
FluxMapStore
ReduceStore를 상속한 클래스 Store의
상태를 기본적으로 Immutable.Map 으로 선언하고
그와 관련한 몇 가지 메서드를 추가한 클래스
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L40-L44
#L59-L72
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L40-L44
#L59-L72
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L40-L44
#L59-L72
getInitialState 메서드가 정의돼 있고
상태로 Immutable.Map을 반환한다.
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L40-L44
#L59-L72
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L40-L44
#L59-L72
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L40-L44
#L59-L72Immutable.Map에서 값을 가져오기
위한 일부 메서드가 정의돼 있다.
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L26-L37
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L26-L37
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L26-L37
상태는 Immutable.Map 이므로 관련
API를 사용해 값을 변경한다.
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L26-L37
FluxMapStore
(https://github.com/facebook/flux/blob/master/src/stores/FluxMapStore.js)
#L26-L37
컴포넌트에서는 다음과 같이 사용할
수 있다.
FluxMapStore
“
”
FluxContainer
자체적으로 관리하는 State와 Props 없이
Store와 Component의 중간 매개체 역할을 하는
단순한 컨테이너 클래스
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
Container에서 관심있어 하는 Store를
반환한다.
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
componentWillReceiveProps 라이프
사이클 메서드에서 호출된다. Store의
값을 이용해 상태를 변경한다.
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
설정된 상태를 하위 컴포넌트에
전달한다.
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
componentDidMount 라이플 사이클
메서드에서 getStores 메서드를 통해
관계를 맺는 Store 리스트를 얻는다.
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
Store 리스트를 순회하며 addListener
메서드를 호출해 상태 변화를 구독한다.
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
FluxContainer
(https://github.com/facebook/flux/blob/master/src/stores/FluxContainer.js)
#L60-L75
#L92-L109
componentWillReceiveProps 라이프 사이클 메서
드에서 calculateState 메서드를 호출하며 이 메서
드에서 반환되는 값을 setState 한다.
FluxContainer
FluxUtils 기반으로 개발한
사내 회의실 예약 웹 애플리케이션
만들면서 느낀 몇 가지 규칙을 정리
규칙 1.
Container에서 자체적으로 상태를
다루거나 이벤트를 처리하지 않는다.
Container는 Store를 구독하고
Store의 상태 값을 하위 컴포넌트에
전달하는 역할로만 적합하다.
일반적인 방법으로 컴포넌트 독자적인
상태를 선언했다.
?
undefined
undefined
기존 컴포넌트의 방식대로 상태를
다룰 수 없다. setState()를 호출해도
예상대로 동작하지 않는다.
Container에서 이벤트를 처리하기
시작하면 상태가 필요해지며
결국 Container의 구조가 깨져
관리하기 힘들어진다.
FluxStore
Component
FluxStore
Component
구독
FluxContainer
전달
Container에서 이벤트를 처리하기
시작하면 상태가 필요해지며
결국 Container의 구조가 깨져
관리하기 힘들어진다.
FluxStore
Component
FluxStore
Component
구독
FluxContainer
전달
Container는 오로지 컴포넌트와
Store의 중간 다리 역할로써 사용
한다.
Container에서 이벤트를 처리하기
시작하면 상태가 필요해지며
결국 Container의 구조가 깨져
관리하기 힘들어진다.
규칙 2.
특정 컴포넌트의 상태를 다른
컴포넌트에서도 알아야 한다면
Store에 값 추가를 고려한다.
컴포넌트가 컴포넌트를 의존하는
기괴한 형태나 두 컴포넌트를 연결하기
위한 랩퍼 컴포넌트를 늘리지 않는다.
sidebar content
sidebar content
Splitter
sidebar—minimal
content—extend
AppStore 클래스를 생성하고
extended 상태 값을 선언한다.
TOGGLE_EXTEND_MODE 액션이
전달되면 extended 값을 반전하여
상태를 재설정한다.
Spliiter 컴포넌트의 클릭 이벤트가
발생하면 TOGGLE_EXTEND_MODE
액션을 디스패치한다.
상태 값이 변경되면 리렌더링 되며
두 컴포넌트의 UI 상태가 변경된다.
ContentSidebar
AppStore
FluxContainer
ContentSidebar
AppStore
FluxContainer
ContentSidebar
AppStore
FluxContainer
ContentSidebar
AppStore
FluxContainer
ContentSidebar
AppStore
FluxContainer
두 컴포넌트를 잇는 랩퍼 컴포넌트를 작성하다보면
랩퍼컴포넌트에책임이몰리거나경계가모호해지는
경향이 있고, 애플리케이션이 커질 수록 많은 랩퍼
컴포넌트가양상되는문제점도있다.
규칙 3.
AJAX나 이벤트에 따른 Dispatch는
Action으로 추상화한다.
컴포넌트에서 Ajax를 직접 사용하면
컴포넌트의 독립성이 저하되고 재사용하기
힘들어진다.
ReservationSection Splitter
Time Details
Sidebar Timeline
ReservationSection Splitter
Time Details
Sidebar Timeline
Dispatch
&
AJAX
Dispatch
&
AJAX
Dispatch
&
AJAX
Dispatch
&
AJAX
Dispatch
&
AJAX
Dispatch
&
AJAX
ReservationSection Splitter
Time Details
Sidebar Timeline
ReservationSection Splitter
Time Details
Sidebar Timeline
Dispatch
Ajax
Call Call
Actions
https://github.com/facebook/flux/tree/master/examples/flux-chat/js
MessageComposer.react.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/components/MessageComposer.react.js
MessageComposer.react.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/components/MessageComposer.react.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/actions/ChatMessageActionCreators.js
CheatMessageActionCreators.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/actions/ChatMessageActionCreators.js
CheatMessageActionCreators.js
ChatWebAPIUtils.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/utils/ChatWebAPIUtils.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/utils/ChatWebAPIUtils.js
ChatWebAPIUtils.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/actions/ChatServerActionCreators.js
ChatServerActionCreators.js
https://github.com/facebook/flux/blob/master/examples/flux-chat/js/actions/ChatServerActionCreators.js
ChatServerActionCreators.js
MessageComposer
CheatMessae

ActionCreators
ChatWebAPIUtils
ChatServer

ActionCreators
MessageComposer
CheatMessae

ActionCreators
ChatWebAPIUtils
ChatServer

ActionCreators
createMessage()
MessageComposer
CheatMessae

ActionCreators
ChatWebAPIUtils
ChatServer

ActionCreators
createMessage()
dispatch()
MessageComposer
CheatMessae

ActionCreators
ChatWebAPIUtils
ChatServer

ActionCreators
createMessage()
dispatch()
createMessage()
MessageComposer
CheatMessae

ActionCreators
ChatWebAPIUtils
ChatServer

ActionCreators
createMessage()
dispatch()
createMessage()
receiveCreatedMessage()
MessageComposer
CheatMessae

ActionCreators
ChatWebAPIUtils
ChatServer

ActionCreators
createMessage()
dispatch()
createMessage()
receiveCreatedMessage()
ActionCreators Utils
물리적으로 나눠 놓은 두 개념의 관심사가 섞여 있다는 느낌
억지로 뜯어 놓은 느낌이 강하고 객체의 흐름을 복잡하게 한다.
ActionCreators Utils
그렇다면 두 개념의 관심사를 다시 나눠보자.
CheatMessaeActionCreators.js
CheatMessaeActionCreators.js
Utils에서 ActionCreators 객체를 직접 호출하는게 아니라,
ActionCreators에서 Dispatch와 관련한 모든 업무를 담당한다.
ChatWebAPI.js
ChatWebAPI.js
Utils가 아니라 Ajax 요청을 담당하는 미들웨어를 만들고
이 객체에서는 오로지 Ajax 요청만 담당한다.
MessageComposer
CheatMessae

ActionCreators
ChatWebAPI
MessageComposer
CheatMessae

ActionCreators
createMessage()
ChatWebAPI
MessageComposer
CheatMessae

ActionCreators
createMessage()
dispatch()
ChatWebAPI
MessageComposer
CheatMessae

ActionCreators
createMessage()
createMessage()
dispatch()
ChatWebAPI
MessageComposer
CheatMessae

ActionCreators
createMessage()
createMessage()
Promise
dispatch()
ChatWebAPI
MessageComposer
CheatMessae

ActionCreators
createMessage()
createMessage()
Promise
dispatch()
dispatch()
ChatWebAPI
규칙 4.
Store에서 AJAX를 호출하지 않는다 Store는 비동기 로직을 작성하기 적합
하지 않다.
클래스의 구현 로직, 사용 예제를 살펴보면
Store는 비동기 로직을 고려해 디자인돼
있지 않다는 사실을 알 수 있다.
Actions 객체에서 AJAX를 요청하고, AJAX 요청 결과를 액션을 통해
Store로 전달하는게 가장 자연스러운 형태다.
규칙5.
UI가 크게 변경되거나 Container가 커진
다면 URL 디자인을 고려한다.
하나의 URL에 너무 많은 요소를 담을 때
Container는 거대해지고 관리하기힘들어
진다.
UI가 복잡해 짐에도 하나의 URL로 모든
인터렉션을 처리하면 Container가 크게 복잡해진다.
return (
<div>
<Header date={params.date}/>
<Sidebar date={params.date} minimal={this.state.extended}/>
<Content extend={this.state.extended}>
<TimeGutter start={startTime} end={endTime}/>
<Schedule>
<RoomTypes rooms={roomList}/>
<Timeline
date={params.date}
rooms={roomList}
events={this.state.events}
profile={this.state.profile}
start={startTime}
end={endTime}
/>
</Schedule>
<Popover date={params.date} options={this.state.popover}/>
</Content>
<Preloader show={this.state.loading}/>
<ModalReservation
date={params.date}
show={true}
rooms={roomList}
users={this.state.users}
values={this.state.creating}
start={startTime}
end={endTime}
/>
</div>
);
예약 현황을 출력하는
컴포넌트 조합
회의실 예약 시 사용하는
예약 하기 모달 창
http://OOO.com/calendar/2015-11-30
http://OOO.com/calendar/2015-11-30/create
예약 현황 보기
회의실 예약 하기
URL을 잘 디자인하면 Container의 책임을 적절히
나눌 수 있고, 가볍게 관리할 수 있다.
감사합니다.

Contenu connexe

Tendances

Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기DoHyun Jung
 
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Jemin Huh
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우NAVER D2
 
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XpressEngine
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot introJae-il Lee
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅Keesun Baik
 
Vert.x 세미나 이지원_배포용
Vert.x 세미나 이지원_배포용Vert.x 세미나 이지원_배포용
Vert.x 세미나 이지원_배포용지원 이
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례Daehwan Lee
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기corund
 

Tendances (18)

Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
Flux 예제 분석 2
Flux 예제 분석 2Flux 예제 분석 2
Flux 예제 분석 2
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
 
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot intro
 
03.Ansible 소개
03.Ansible 소개03.Ansible 소개
03.Ansible 소개
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
Vert.x 세미나 이지원_배포용
Vert.x 세미나 이지원_배포용Vert.x 세미나 이지원_배포용
Vert.x 세미나 이지원_배포용
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례
 
Express 프레임워크
Express 프레임워크Express 프레임워크
Express 프레임워크
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기
 

Similaire à 다함께, FluxUtils 한바퀴!

React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기WebFrameworks
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2plusperson
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템박 민규
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴Sanghyuk Jung
 
오픈세미나 플러그인만들기
오픈세미나 플러그인만들기오픈세미나 플러그인만들기
오픈세미나 플러그인만들기승훈 오
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2YoungSu Son
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 SeongHyun Ahn
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱NAVER D2
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개 SuHyun Jeon
 
Git from google techtalks by Randal
Git from google techtalks by RandalGit from google techtalks by Randal
Git from google techtalks by Randalyagurchoi
 
클라우드 서비스운영 플랫폼 가루다
클라우드 서비스운영 플랫폼 가루다클라우드 서비스운영 플랫폼 가루다
클라우드 서비스운영 플랫폼 가루다상욱 송
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱uEngine Solutions
 

Similaire à 다함께, FluxUtils 한바퀴! (20)

react-ko.pdf
react-ko.pdfreact-ko.pdf
react-ko.pdf
 
React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기
 
React Everywhere
React EverywhereReact Everywhere
React Everywhere
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴
 
오픈세미나 플러그인만들기
오픈세미나 플러그인만들기오픈세미나 플러그인만들기
오픈세미나 플러그인만들기
 
(리액트기초강좌)Reactjs helloworld_리액트공부열심히하세요~
(리액트기초강좌)Reactjs helloworld_리액트공부열심히하세요~(리액트기초강좌)Reactjs helloworld_리액트공부열심히하세요~
(리액트기초강좌)Reactjs helloworld_리액트공부열심히하세요~
 
REACTJS HelloWorld
REACTJS HelloWorldREACTJS HelloWorld
REACTJS HelloWorld
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개
 
Git from google techtalks by Randal
Git from google techtalks by RandalGit from google techtalks by Randal
Git from google techtalks by Randal
 
클라우드 서비스운영 플랫폼 가루다
클라우드 서비스운영 플랫폼 가루다클라우드 서비스운영 플랫폼 가루다
클라우드 서비스운영 플랫폼 가루다
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
 

Plus de 우영 주

스트리밍과 디지털 권리 관리
스트리밍과 디지털 권리 관리스트리밍과 디지털 권리 관리
스트리밍과 디지털 권리 관리우영 주
 
스트리밍과 플레이어
스트리밍과 플레이어스트리밍과 플레이어
스트리밍과 플레이어우영 주
 
프런트엔드개발, 지금과 다음
프런트엔드개발, 지금과 다음프런트엔드개발, 지금과 다음
프런트엔드개발, 지금과 다음우영 주
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기우영 주
 
아재가 젊은이에게 사랑받는 마크업을 하는 방법
아재가 젊은이에게 사랑받는 마크업을 하는 방법아재가 젊은이에게 사랑받는 마크업을 하는 방법
아재가 젊은이에게 사랑받는 마크업을 하는 방법우영 주
 
Introduce Guetzli
Introduce GuetzliIntroduce Guetzli
Introduce Guetzli우영 주
 
스코프와 실행문맥
스코프와 실행문맥스코프와 실행문맥
스코프와 실행문맥우영 주
 
좋은 기능을 만드는 방법
좋은 기능을 만드는 방법좋은 기능을 만드는 방법
좋은 기능을 만드는 방법우영 주
 
서비스를 성공적으로 만드는 방법
서비스를 성공적으로 만드는 방법서비스를 성공적으로 만드는 방법
서비스를 성공적으로 만드는 방법우영 주
 
BEM을 깨우치다.
BEM을 깨우치다.BEM을 깨우치다.
BEM을 깨우치다.우영 주
 
JavaScript Promises
JavaScript PromisesJavaScript Promises
JavaScript Promises우영 주
 
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강 [토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강 우영 주
 
명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI우영 주
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기우영 주
 
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)우영 주
 
Javascript Test Double Sinon.js
Javascript Test Double Sinon.jsJavascript Test Double Sinon.js
Javascript Test Double Sinon.js우영 주
 
HTML5 BOILERPLATE를 소개합니다.
HTML5 BOILERPLATE를 소개합니다.HTML5 BOILERPLATE를 소개합니다.
HTML5 BOILERPLATE를 소개합니다.우영 주
 
이클립스로 GIT 사용하기
이클립스로 GIT 사용하기이클립스로 GIT 사용하기
이클립스로 GIT 사용하기우영 주
 

Plus de 우영 주 (19)

스트리밍과 디지털 권리 관리
스트리밍과 디지털 권리 관리스트리밍과 디지털 권리 관리
스트리밍과 디지털 권리 관리
 
스트리밍과 플레이어
스트리밍과 플레이어스트리밍과 플레이어
스트리밍과 플레이어
 
프런트엔드개발, 지금과 다음
프런트엔드개발, 지금과 다음프런트엔드개발, 지금과 다음
프런트엔드개발, 지금과 다음
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
 
아재가 젊은이에게 사랑받는 마크업을 하는 방법
아재가 젊은이에게 사랑받는 마크업을 하는 방법아재가 젊은이에게 사랑받는 마크업을 하는 방법
아재가 젊은이에게 사랑받는 마크업을 하는 방법
 
Introduce Guetzli
Introduce GuetzliIntroduce Guetzli
Introduce Guetzli
 
스코프와 실행문맥
스코프와 실행문맥스코프와 실행문맥
스코프와 실행문맥
 
좋은 기능을 만드는 방법
좋은 기능을 만드는 방법좋은 기능을 만드는 방법
좋은 기능을 만드는 방법
 
서비스를 성공적으로 만드는 방법
서비스를 성공적으로 만드는 방법서비스를 성공적으로 만드는 방법
서비스를 성공적으로 만드는 방법
 
BEM을 깨우치다.
BEM을 깨우치다.BEM을 깨우치다.
BEM을 깨우치다.
 
JavaScript Promises
JavaScript PromisesJavaScript Promises
JavaScript Promises
 
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강 [토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
 
명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI명세부터 깨우치는 FILEAPI
명세부터 깨우치는 FILEAPI
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
 
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
 
Javascript Test Double Sinon.js
Javascript Test Double Sinon.jsJavascript Test Double Sinon.js
Javascript Test Double Sinon.js
 
LESS와 EMMET
LESS와 EMMETLESS와 EMMET
LESS와 EMMET
 
HTML5 BOILERPLATE를 소개합니다.
HTML5 BOILERPLATE를 소개합니다.HTML5 BOILERPLATE를 소개합니다.
HTML5 BOILERPLATE를 소개합니다.
 
이클립스로 GIT 사용하기
이클립스로 GIT 사용하기이클립스로 GIT 사용하기
이클립스로 GIT 사용하기
 

다함께, FluxUtils 한바퀴!