2018년 11월 26일 COEX에서 진행된 HTML5 Conference 발표 자료입니다. 실제 현장에서 발표한 자료와는 다소 차이가 있을 수 있습니다.
본 발표는 React Native를 통한 하이브리드 웹 애플리케이션 개발의 개념, 배경, 적용 사례를 다루고 있습니다. 발표는 김나람님이 진행해주셨습니다.
UNIST 프로그래밍 동아리 HeXA (http://www.hexa.pro) 내부 React 강의 프레젠테이션 자료의 공개버전
내용
- HTML, Javascript 속성 튜토리얼
- React 소개
- Node.js 설치
https://github.com/kimxogus/react-tutorial
2018년 11월 26일 COEX에서 진행된 HTML5 Conference 발표 자료입니다. 실제 현장에서 발표한 자료와는 다소 차이가 있을 수 있습니다.
본 발표는 React Native를 통한 하이브리드 웹 애플리케이션 개발의 개념, 배경, 적용 사례를 다루고 있습니다. 발표는 김나람님이 진행해주셨습니다.
UNIST 프로그래밍 동아리 HeXA (http://www.hexa.pro) 내부 React 강의 프레젠테이션 자료의 공개버전
내용
- HTML, Javascript 속성 튜토리얼
- React 소개
- Node.js 설치
https://github.com/kimxogus/react-tutorial
iOS App 개발 with React Native + ClojureScriptCheolhee Han
ClojureScript 와 React Native 를 이용하여, 사물인터넷 기기와 App의 프로토타입 개발한 결과를 시연합니다.
React Native 를 채택까지의 과정을 전개합니다.
왜 Clojure로 개발하는가? 대한 이야기.
소스 저장소
https://github.com/cheolhee/ReactNativeDuckie
기존 내용을 수정. Edit가 안되어 다시 올림.
기존 내용을 보셨으면 안보셔도 됩니다.
GraphQL overview,
GraphQL란
Schema (entity 및 entity간 관계설정)
graphiql 이란?
query + mutation sample
Sample code,
https://github.com/gidong-lee/graphQL_exam
크고 아름다운 Java 기반의 레거시 시스템. 하지만 매일 같이 반복되는 Java 코드를 찍어내기에 지쳤다면? 레거시 시스템에 Django를 들이밀어 한DB 두살림을 구축해보자. 아 그거 inspectdb 하나만 쓰면 되는 거 아닌가? 크고 작은 삽질들을 모아모아 공유합니다.
iOS App 개발 with React Native + ClojureScriptCheolhee Han
ClojureScript 와 React Native 를 이용하여, 사물인터넷 기기와 App의 프로토타입 개발한 결과를 시연합니다.
React Native 를 채택까지의 과정을 전개합니다.
왜 Clojure로 개발하는가? 대한 이야기.
소스 저장소
https://github.com/cheolhee/ReactNativeDuckie
기존 내용을 수정. Edit가 안되어 다시 올림.
기존 내용을 보셨으면 안보셔도 됩니다.
GraphQL overview,
GraphQL란
Schema (entity 및 entity간 관계설정)
graphiql 이란?
query + mutation sample
Sample code,
https://github.com/gidong-lee/graphQL_exam
크고 아름다운 Java 기반의 레거시 시스템. 하지만 매일 같이 반복되는 Java 코드를 찍어내기에 지쳤다면? 레거시 시스템에 Django를 들이밀어 한DB 두살림을 구축해보자. 아 그거 inspectdb 하나만 쓰면 되는 거 아닌가? 크고 작은 삽질들을 모아모아 공유합니다.
모티브 :
웹 페이지에서 일어나는 사용자의 단일 액션에 대응하는 일련의 프로세스를 하나의 클래스에서 구현한다. 일련의 프로세스는 사용자가 서버에 요청을 하기 위해서 클릭을 한다거나 입력을 하고 요청을 하고 그에 따른 서버 측에서 처리가 이루어지고 처리 결과를 다시 사용자의 브라우저에 통보를 하고 브라우저는 결과를 통해 사용자에게 결과를 인식 시키는 일련의 작업을 말합니다.
목적 및 장점 :
1. CRUD(Create, Read, Update, Delete) 인터랙션에 대한 처리와 시스템 장애에 대한 빠른 문제 파악과 대응
조건 :
1. XHR Wrapped클래스가 존재하여야 한다. (prototype.js, dojo, jQuery, etc)
2. XHR 오브젝트를 이용한 데이터 처리가 있어야 한다.
3. 요청을 위한 단계와 응답에 대한 처리 단계가 간단하고 명료해야 한다.
제약 :
1. 복잡한 UI 처리 및 CRUD이외의 처리가 다소 병행되어 진다면 클래스 혹은 객체가 무거워질 수 있다.
단점 :
1. 특정한 인터랙션 위한 패턴으로 확장(extend) 및 소스 재사용 면에서 용이하지 못함
2. Redux 는?
액션으로 스테이트를 변경해주는 역할.
리덕스는 크게
이렇게 구성되어 있음 Action, Reducer , Store
-Action: 어떤 행동을 하기 위한 단순히 객체데이터 e.g: { type: 액션이름 , 변수: ..,
변수.. }특징으로는 항상 type 이라는 곳에 액션 고유 이름을 선언한 다는 것. (이것
으로 액션을 보낼 곳에서 어떤 액션이 들어왔는지 인식함)
3. 첫 번째, Action
-Action: 어떤 행동을 하기 위한 단순히 객체데이터 e.g: { type: 액션이름 , 변수: ..,
변수.. }특징으로는 항상 type 이라는 곳에 액션 고유 이름을 선언한 다는 것. (이것
으로 액션을 보낼 곳에서 어떤 액션이 들어왔는지 인식함)
여기서 중요한 것은 간혹 코드에 보이는 Type safe를 위해서 사용된 코드와는 상관
없는 type 임. 그저 액션에 대한 고유한 명을 전달하기 위해서 정해진 type이라는
key,value 의 key 값임
4. 두 번째, Reducer
리듀서는 그저 이전에 있던 state 를 새로운 state 로 변경 해주는 역할.
예를 들어서 이전 state 가 {myName : “i’m crazy” } 고 내가 원하는 것은 이 스테이
트를 변경하고자 하면{myName:”i’m not crazy” yourName:”you are crazy”} 라고
바꾸는 역할이 reducer 의 역할.
코드에서 선언은 보통 이렇게 되어있음. (이그나이트의 redux 폴더 참고).
export const request = (state: Object) => state.merge({ fetching: true })
이전 state 가 저렇게 들어오면 fetching 이라는 새로운 값을 이전 스테이트
(state:Object) 에 저장해서 넘겨줌.
5. 두 번째, Reducer
리듀서는 앞서 말한 것처럼 저렇게 스테이트 변경을 선언한 뒤에,
export const reducer = createReducer(INITIAL_STATE, {
[Types.LOGIN_REQUEST]: request,
[Types.LOGIN_SUCCESS]: success,
[Types.LOGIN_FAILURE]: failure,
[Types.LOGOUT]: logout
})
이렇게 action 과 매칭해 줘야됨. Types.LOGIN_REQUEST 는 action 을 라이브러리
써서 상수화 한 녀석인데 저 상수 안에는 { type: “login_request_unique”} 같은 값
이 들어있겠다는 것을 대충 예측할 수 있음. 저렇게 상수화 하는 이유는 당연히 위
처럼 key,value 값으로 이루어진 배열로 액션을 계속 호출하기 불편하기 때문임.
6. 여기서 잠깐, ActionCreater 에 대해서 알아보자
(redux/LoginRedux.js 상단 참고) 아래는 액션 선언 코드.
export const reducer = createReducer(INITIAL_STATE, {
[Types.LOGIN_REQUEST]: request,
[Types.LOGIN_SUCCESS]: success,
[Types.LOGIN_FAILURE]: failure,
[Types.LOGOUT]: logout
})
Types.LOGIN_REQUEST 라는 액션상수를 만들어 주는 library 가 있
음.(/Redux/LoginRedux.js 제일 상단 임포트 참고)
import { createReducer, createActions } from 'reduxsauce'
바로 위 코드에 createActions 임.
7. 여기서 잠깐, ActionCreater 에 대해서 알아보자
아래 예제 코드를 분석하면
const { Types, Creators } = createActions({
loginRequest: ['username', 'password'],
loginSuccess: ['username'],
loginFailure: ['error'],
logout: null
})
export const LoginTypes = Types
export default Creators
createAction을 사용해서 위 결과물이 Types.LOGIN_REQUEST 라는 Action 상수가
만들어지는데, createActions 의 loginRequest:[‘username’,’password’] 는 원래
Types.LOGIN_REQUEST ={ type: ‘loginRequest’ username:”” password:””}
이랑 같음. 상수에다가 저렇게 액션을 매칭해서 만들어 줌.
8. 마지막 store
store 는 별거 없음. reducer 랑 action 을 선언한 뒤에 보통
이렇게 매칭해주는데
export const reducer = createReducer(INITIAL_STATE, {
[Types.LOGIN_REQUEST]: request,
[Types.LOGIN_SUCCESS]: success,
[Types.LOGIN_FAILURE]: failure,
[Types.LOGOUT]: logout
})
만들어둔 리듀서랑 액션은 액션상수:리듀서 로 위처럼 매칭함. 그리고 createReducer
로 리듀서를 만들고 , 위 리듀서는 INITIAL_STATE를 액션에 따라서 리듀서를 호출해서
변경해주는 것임.
9. 마지막 store
store 는 간단함. reducer 랑 action 을 선언한 뒤에 보통
이렇게 매칭해주는데 (redux/LoginRedux.js 참고)
export const reducer = createReducer(INITIAL_STATE, {
[Types.LOGIN_REQUEST]: request,
[Types.LOGIN_SUCCESS]: success,
[Types.LOGIN_FAILURE]: failure,
[Types.LOGOUT]: logout
})
만들어둔 리듀서랑 액션은 액션상수:리듀서 로 위처럼 매칭함. 그리고 createReducer
로 리듀서를 만들고 , 위 리듀서는 INITIAL_STATE를 액션에 따라서 리듀서를 호출해서
변경해주는 것임.
10. 마지막 store
만들어진 reducer들은 아래처럼 루트리듀서로 합치고, 그 뒤에 이 리듀서를 store 에
넣는 것임.
export default () => {
/* ------------- Assemble The Reducers ------------- */
const rootReducer = combineReducers({
temperature: require('./TemperatureRedux').reducer,
login: require('./LoginRedux').reducer,
search: require('./SearchRedux').reducer,
})
return configureStore(rootReducer, rootSaga)
}
11. 마지막 store
그 뒤 우리는 다양한 리엑트 컨퍼넌트에서 store 에다가 액션을 던지면(dispatch를 이
용해서 던짐.)
그 store에서 우리가 만든 rootReducer 가 그 액션을 감지하고, 매칭되어 있는
Reducer를 호출 하는 것임.!!
Redux End!!
그 다음은 Redux saga 를 설명함.