We built React to solve one problem: building large applications with data that changes over time.
번역: 우리는 지속해서 데이터가 변화하는 대규모 애플리케이션을 구축하기 위해 React를 만들었습니다
이전에도 많은 프론트엔드 프레임워크/라이브러리가 존재했지만 대부분 작동방식은 양방향 바인딩을 통하여 모델에 있는 값이 변하면 뷰에서도 이를 변화하는 MVC패턴을 사용했다. 여기서 핵심적인 부분은 변화시켜준다라는 것이다. 일단 첫 화면을 보여주고, 변화에 따라 필요한곳을 바꿔주는 것이다. 변화는 어플리케이션이 방대해질수록 매우 복잡한 작업이 되었다. 페이스북 고질적인 문제였던 읽었던 페이지에도 숫자표시가 줄어들지 않은 이 부분이 MVC패턴에 대표되는 문제로 야기됐었다.
규모가 큰 어플리케이션에서 변화(Mutation)는 상당히 복잡한 작업이다. 특정 이벤트가 발생하면 모델에 변화를 일으키고 그 변화로 인해 어떤 DOM 을 가져와서 어떠한 방식으로 뷰를 업데이트 해줄 지 로직을 정해야 한다. 페이스북에서는 이 문제를 해결하기 위해 다음과 같은 개념으로 출발한다.
데이터가 바뀌면 그냥 뷰를 날려버리고 새로 만들어버리면 어떨까?
그러나, DOM 기반으로 작동하는 페이지는 매번 새로 뷰를 만들어버리라고 하면 성능적으로 엄청난 문제가 발생할 것이다.
여기서 나온 중요한 개념이 Virtual DOM 이다.
막연하게 생각했을 땐 느릴거 같긴한데 왜 성능적으로 엄청난 문제가 되는거지?
browser에서 DOM이 어떤방식으로 나타나는지 확인해보면 알 수 있지 않을까?
DOM에 변화가 생기면, Render Tree를 재생성하고 (그러면 모든 요소들의 스타일이 다시 계산됨) Layout, Painting을 하는 과정이 다시 반복됨
복잡한 SPA(싱글 페이지 어플리케이션) 에서는 DOM 조작이 많이 발생한다.
그 뜻은 그 변화를 적용하기 위해 브라우저가 많이 연산을 해야한단 소리고, 전체적인 프로세스를 비효율적으로 만든다.
DOM 조작의 실제 문제는 각 조작이 레이아웃 변화, 트리 변화와 렌더링을 일으킨다는 것.
예를 들어 여러분이 30개의 노드를 하나 하나 수정하면, 그 뜻은 30번의 (잠재적인) 레이아웃 재계산과 30번의 (잠재적인) 리렌더링을 하게 된다.
Virtual DOM 은 DOM 차원에서의 더블 버퍼링이라고 보면 된다.
변화가 일어나면 그걸 Virtual DOM 트리에 적용한다. Virtual DOM 트리는 렌더링도 되지 않기때문에 연산 비용 적다. 연산이 끝나고나면 그 최종적인 변화를 실제 DOM 에 적용한다.
모든 변화를 하나로 묶어서 딱 한번만 적용
하나로 묶어서 적용시키는것이, 연산의 횟수를 줄이는 것이다.
단지 이 이유에서만 Virtual DOM 을 사용하는 것은 아니다.
사실, 위 과정은 Virtual DOM 이 없이도 있다. 변화가 있을 때, 그 변화를 묶어서 DOM fragment 에 적용한 다음에 기존 DOM 에 던져주면 되는 것이다.
그러면, Virtual DOM 이 해결 하려고 하는건 무엇이냐?
DOM fragment를 관리하는 과정을 수동으로 하나하나 작업 할 필요 없이, 자동화하고 추상화하는 것이다.
그 뿐만 아니라, 만약에 이 작업을 직접 한다면, 기존 값 중 어떤게 바뀌었고 어떤게 바뀌지 않았는지 계속 파악하고 있어야하는데 (그렇지 않으면 수정 할 필요가 없는 DOM 트리도 업데이트를 하게 될 수도 있다), 이것도 Virtual DOM이 어떤게 바뀌었는지 ,어떤게 바뀌지 않았는지 알아내어 이걸 자동으로 해준다.
마지막으로, DOM 관리를 Virtual DOM 이 하도록 함으로써, 컴포넌트가 DOM 조작 요청을 할 때 다른 컴포넌트들과 상호작용을 하지 않아도 되고, 특정 DOM 을 조작할 것 이라던지, 이미 조작했다던지에 대한 정보를 공유 할 필요가 없다.
즉, 각 변화들의 동기화 작업을 거치지 않으면서도 모든 작업을 하나로 묶어줄 수 있다.
Flow
데이터가 바뀌어서 변화가 일어나면,
거짓: React가 DOM 보다 빠르다.
사실: 유지보수 가능한 어플리케이션을 만드는것을 도와주고 대부분의 경우에 ‘충분히 빠르다’
-Redux 창시자이자 React 개발팀원인 Dan Abramov 의 트윗-
Flux 패턴의 핵심은 어플리케이션 데이터가 단방향으로 흐른다는 것이다.
Facebook에서 클라이언트-사이드 웹 어플리케이션을 만들기 위해 사용하는 어플리케이션 아키텍쳐다. 단방향 데이터 흐름을 활용해 뷰 컴포넌트를 구성하는 React를 보완하는 역할을 한다.
새로운 데이터를 포함하고 있는 간단한 객체로 type 프로퍼티로 구분 가능
모든 데이터를 관리하는 Control 역할이며 Action 이 시작될 때 어떻게 Store가 업데이트되어야 하는지 결정(Callback 모음 요소)
APP의 모든 데이터를 저장
Store가 변경된 경우같이 변경, 사용자의 상호작용에 응답하기 위해 새로운 action을 만들어 시스템에 전파
이러한 구조는 함수형 반응 프로그래밍(functional reactive programming) 이나 더 세부적으로 데이터-흐름 프로그래밍(data-flow programming) 또는 흐름 기반 프로그래밍(Flow-based programming) 을 연상하게 한다는 사실을 쉽게 떠올리게 한다.
어플리케이션의 상태는 store에 의해 어플리케이션의 다른 부분들과 결합도를 극히 낮춘 상태로 유지될 수 있다. store의 사이에서 의존성이 생긴다고 해도 dispachter에 의해 엄격한 위계가 유지되어 동기적으로 갱신되는 방식으로 관리된다.
먼저 애플리케이션이 초기화할 때 딱 한번 준비과정을 가진다.
준비과정이 끝나면 애플리케이션은 유저 입력을 위한 준비가 완료된다.
"Flux는 새로운 것이 아닌 MVC의 새로운 이름이다"
"MVC를 제대로 알지 못했거나 이벤트 기반으로 조금 변형 형태이다."
-Reddit 글 중에서-
JavaScript XML
HTML 마크업을 개발하듯이 JavaScript 내에서 사용할 수 있게 만들어진 JavaScript확장언어
과거 페이스북이 만들었던 PHP의 개량판 XHP에 그 만들어진 배경이 있음
React는 별도의 파일에 HTML마크업과 JavaScript로직을 분리하는 대신, 둘 다 포함하는 “컴포넌트(Component)”라고 부르는 느슨하게 연결된 유닛으로 관심사를 분리(SoC)한다.
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
https://ko.reactjs.org/docs
https://velopert.com/3612
https://blog.gaerae.com/2016/04/hello-react.html
https://velopert.com/3236
https://lemontia.tistory.com/637
https://bestalign.github.io/2015/10/06/cartoon-guide-to-flux/