본문 바로가기
개발일기/리액트,Next.js

react 개념 익히기? 개념익히고, 설치하고, 공부하기 위한 툴 고르는 과정 까지

by 프로그래머콩 2019. 7. 4.

* 블로그 강의 : https://velopert.com/category/dev-log/tech-log/react-js

* 동영상 강의 : https://www.inflearn.com/course/react-%EA%B0%95%EC%A2%8C-velopert/

* 외부링크 관련 강의 : http://webframeworks.kr/getstarted/reactjs/

*14.8 download : https://facebook.github.io/react/blog/2016/03/29/react-v0.14.8.html

1.1 강의노트

React 개념?

- React는 페이스북에서 개발한 유저인터페이스 라이브러리

- Virtual DOM 이라는 개념을 사용하여 상태의 변함에 따라 선택적으로 유저인터페이스를 렌더링

- 따라서, 최소한의 DOM 처리로 컴포넌트들을 업데이트 할 수 있게 함.

( 일반적인 DOM및 렌더 트리 구성은 아래와 같음, 매우 순차적. )

Dom?

DOM(Document Object Model)?

- 객체를 통하여 구조화된 문서를 표현하는 방법. 주로 XML혹은 HTML로 작성됨.

- 정적이고, 트리형태로 구성되어있으며, JavaScript와 CSS를 적용시켜 화려한 front를 창조하기도함.

- DOM 자체의 처리속도는 빠른편이나, 브라우저 단에서 DOM의 변화가 일어나면, 브라우저가 CSS를 다시 연산하고 > 레이아웃을 구성하고 > 웹페이지를 리페인트 하는데 이 과정에서 시간이 허비된다.

- 여기서 레이아웃을 새로 구성하면서 계산하는 것을 reflow라고 하고, 색상 변경과 같은 레이아웃에 관계없는 것들을 거리하

는건 repaint 라고 함.

DOM의 문제점?

- 브라우저는 미뤄두고 하는 기능도 가지고있다 : 코드가 실행될 때마다 reflow를 진행한다 판단하면 (성능이 저하된다 판단하면) 브라우저는 미뤄두고 한꺼번에 일을 처리하도록 유도한다.

- 하지만 제때제때 가져와야하는 값들 혹은 이벤트들도 있다. (offsetTop, scrollTop, getComputedStyle)등의 코드가 실행 될 때는 현재의 값을 가저오는 것들이 중요하기 때문에 reflow가 여러번 발생 할 수 밖에 없다.

- 그렇기 때문에, 성능 개선을 위해서는 reflow 횟수를 줄이기 위해 코드를 최적화 해야함.

DOM의 문제점 해결법?

- Virtual DOM (?)

- html -> 시각화 : 어쩔 수 없음 ( 주역할이기 때문에 )

- 적어도 최소한의 DOM조작을 통해 우리의 작업을 처리하는 방식으로 이를 개선해야 함.

- 만약, DOM 작업을 가상화 하여 미리 처리한 다음에 한꺼번에 적용할 수 있는 방법이 있다면?

( 출처 : https://www.slideshare.net/taggon/react-js-46357445 )

Virtual DOM 을 사용하면, 실제 DOM 에 접근하여 조작하는 대신에, 이를 추상화 시킨 자바스크립트 객체를 구성하여 사용합니다.

이는 마치 실제 DOM 의 가벼운 사본과도 비슷하죠.(?)

React 에서 데이터가 변하여 브라우저상의 실제 DOM 을 업데이트 할 때에는 다음과 같이 3가지 절차를 밟습니다:

1. 데이터가 업데이트되면, 전체 UI 를 Virtual DOM 에 리렌더링 합니다.

2. 이전 Virtual DOM 에 있던 내용과 현재의 내용을 비교합니다.

3. 바뀐 부분만 실제 DOM 에 적용이 됩니다.

결국에는 컴포넌트가 업데이트 될 때, 레이아웃 계산이 한번만 이뤄집니다.

Node.js?

NPM?

NPM?

- node.js 기본 모듈 이외에 수많은 개발자들이 만들어 배포한 외부 모듈을 쉽게 관리하기 위해 만들어진 소프트웨어의 일종.

- 확장모듈의 일종이라고도 함.

< 중간 점검 - 느낀 점 및 목차 따라가는 것에 대한 >

* 궁극적인 고민 : WP에 어떻게 접목 시킬 것인가?

- 작업환경 구축하는 강의를 보면 거의 node.js를 기반으로 설명을 해줌.

- node.js없이 react.js를 사용할 수 있는 방법은 없을까?

- 고민하는 이유? 개발환경 구축 때문에, node.js를 서버때문에 사용하는것 같은데 wp위에서 사용하는 우리가 굳이 필요가 있을까?

- 공부만 할 때 사용하는 툴

- https://www.webpackbin.com/

접속 : NPM없이 브라우저에서 webpack을 사용해서 프로젝트 생성할 수 있게 도와주는 tool.

- 상단의 [Boilerplates] > [React] 클릭 : [React]프로젝트 바로 클론해서 바로 시작하기.

https://jsfiddle.net/velopert/8tmek6yv/1/

접속 : NPM없이 브라우저에서 webpack을 사용해서 프로젝트 생성할 수 있게 도와주는 tool의 일종.

- 브라우저에서 React.js프로젝트를 작성 할 수 있는 것이 장점이나, JavaScript를 한 파일에서 작성해야하고 ES6의 문법 모두를 제대로 지원하지 않는다는 점이 아쉬움.

- 공부할때는 문제가 없다고 함.

- jquery 외부 링크 불러오는 방법처럼 설치하는 방법

 

(출처 - http://webframeworks.kr/getstarted/reactjs/ )

React를 시작하기 가장 빠른 방법은 CDN(Contents Delivery Network)을 통해서 Javascript를 제공받는 것

// React Library <script src="https://fb.me/react-0.13.3.js"> </script> // In-browser JSX transformer <script src="https://fb.me/JSXTransformer-0.13.3.js"> </script>

만약 Bower를 선호한다면, 아래와 같은 방법으로 쉽게 React를 이용 가능합니다.

$ bower install --save react

<예제>

<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React</title> <script src="https://fb.me/react-0.13.3.js"></script> <script src="https://fb.me/JSXTransformer-0.13.3.js"></script> </head> <body> <div id="example"></div> <script type="text/jsx"> // ** Example Template ** </script> </body> </html>
// sample01.js var HelloWorld = React.createClass({ render: function() { return ( <p> 안녕, <input type="text" placeholder="이름을 여기에 작성하세요" />! 지금 시간은 {this.props.date.toTimeString()} 입니다. </p> ); } }); setInterval(function() { React.render( <HelloWorld date={new Date()} />, document.getElementById('example') ); }, 500);

< 테스트 결과 > - 잘됨

* 염려되는점 :

- 외부 스크립트를 import하는거라… 속도

- 다운로드 받아서 import하는건?

- 14로 업그레이드 됐다고했는데 지금 import하는건 13v이라 지원안되는 컴포넌트 혹은 구문이 있을까봐 염려됨 (지속적으로 강의를 보면서 해결해 나가야 할 문제 = 알아야 지원되는게 있는지 없는지 알수 있을 듯 함 )

<컴포넌트 구성>

// tutorial1.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> Hello, world! I am a CommentBox. </div> ); } }); React.render( <CommentBox />, document.getElementById('content') );

* 주의할 점 : React 컴포넌트들은 단 하나의 루트노드만을 렌더할 수 있으므로, 여러개의 노드를 리턴하고싶다면, 여러개의 노드를 단 하나의 루트 노드로 조합해야 한다.(객체개념)

* 설명 :

- Ract컴포넌트를 만들기 위해 Ract.createClass()로 javascript객체를 만들어 render메소드를 담아 넘김.

- render 메소드는 React컴포넌트 트리를 리턴

- 최종적으로 실제 HTML그리는 역할을 하는데,

- 개발된 컴포넌트들의 트리를 리턴할 수도 있기 때문에 React가 컴포넌트는 보다 조합(composable)하게 됨.

—> 이를 통해 최상위 컴포넌트의 인스턴스를 만들고, 두번째 인수로 전달받은 DOM 엘리먼트에 마크업을 삽입.

—> ‘<div>’태그는 실제 DOM노드는 아니고, React div 컴포넌트의 인스턴스로서, React가 다룰 수 있는 데이터의 표시자나 조각이라고 생각하면 된다.

—> 또, HTML엘리먼트의 이름은 소문자로 시작하고, 커스텀 React클래스 이름은 대문자로 시작하고 있다.

=> https://velopert.com/900 여기 예제를

=> 아래와 같은 코드로 바꿔 표현할 수 있다( 완전한 컴포넌트구성은 아님 )

=> 결과는 아래와 같음

=> 위 강좌에서는 ‘import’ 방식을 이용해서 ‘컴포넌트’를 묶는 방식을 이용하고 있으나,

작은 단위(모듈) 들을 아래와 같이 묶는게 과연 효율적일까?

=> 데이터 모델 연결 방식이 훨씬 나을 것 같다는 생각( http://webframeworks.kr/getstarted/reactjs/)

(인데.. 왜 이쪽 예제가 안되는지를 아직 해결 못했습니다 ㅠㅠㅠ)

( + 지금 내가 쓰고 있는 툴은 유료지만 공부할 때 부터 개발툴 까지 쭈욱 잘 쓰고있는 'webstorm'! )