[React]React의 Component에 대하여

Edit

[React]React의 Component에 대하여

React에서 가장 중요한게 무엇이냐 묻는다면 당연히 Component 일 것이다. React의 Component는 Angular의 Directive와 매우 유사하다. 이 Component는 하나의 모듈인데 HTML, CSS, JS 및 해당 관련된 데이터로 구성되어 있다. 보통 React에서는 Componentjsx(공식 튜토리얼에서는 이걸 쓴다.)로 되어 있는데 나중에 jsx를 javascript로 변환해주기 위한 컴파인 단계가 필요하다.

React가 UI를 구현하는데 있어 매우 편리한 이유는 데이터가 Component 자체에 포함되어 있기 때문이다.(상위 Component에 포함 될 수 도 있다.)

첫 번째 React 구성 요소를 만들어 보자. React 구성 요소를 생성하려면 React 객체에서 createClass 메소드를 사용하고 createClassComponent에 대한 설명을 전달한다.

var React = require('react')
var ReactDOM = require('react-dom')
var HelloBver = React.createClass({
render: function(){
return (
<div>
Hello Bver!
div>

)

}
});
ReactDOM.render(<HelloBver />, document.getElementById('app'));

createClass에 전달하는 객체의 유일한 메소드는 render 메소드이다. 모든 Component에는 render 메서드가 있어야 한다. 렌더링의 역할은 Component의 템플릿에 우리가 원하는 데이터를 뿌려주기 위함이다. 조심할 점은 왠만하면 return을 ()로 감싸주자. (습관처럼 해주자.) 위 예제에서 Component가 렌더링되면 화면에 표시 될 텍스트는 Hello Bver!이다.

위의 코드에서React.createClass 생성자를 호출 한 결과를 HelloBver라는 변수에 저장했다. ReactDOM.render는 두 개의 인수를 받는데 랜더링 할 componentcomponent를 랜더링 할 DOM 노드이다.(React.render가 아닌 ReactDOM.render를 사용하고 있음을 주목하자) 위의 예제에서 HelloBver component를 가져와 ID가 app 인 요소에 렌더링하도록 React에 지시했다. React의 특징은 부모 component에 랜더링하면 모든 하위 자식 component도 랜더링 되기 때문에 ReactDOM.render는 웹 어플리케이션에서 한 번만 사용해야한다. 만약 전체 어플리케이션을 React로 만ㄷ르려면 component를 document.body에 랜더링 하면 된다.

예제를 자세히 살펴보면 이상한 점이 있다. 바로 JavaScript에 “HTML"이 존재한다는 것이다. 이것은 React만의 특징이다. render 메소드에서 작성하는 “HTML"은 실제 HTML이 아니지만 React가 “JSX"를 호출하는 것이다. JSX를 사용하면 가벼운 JavaScript 객체로 변형된 HTML 구문을 작성할 수 있다. 그런 다음 React는 이러한 JavaScript 객체를 가져 와서 실제 DOM의 “가상 DOM"또는 JavaScript 표현을 형성하게 된다. 즉, 자바스크립트의 힘으로 템플릿의 접근성을 얻는 장점을 얻게 된다. 물론 template를 구분하지 못한에 따른 관리 측면에서는 불리함이 존재한다.

아래 예제를 보면 Webpack의 변환 프로세스를 실행하면 JSX가 변환된다.

var HelloWorld = React.createClass({
displayName: "HelloMessage",
render: function() {
return React.createElement("div", null, "Hello World");
}
});

위처럼 작성하면 이제 JSX -> JS 변환 단계를 거치지 않고 React component를 작성할 수 있지만 더 산으로 간 느낌이다. 참고로 내 주변 React 개발자 중에서 JSX 쓰지 않는 사람을 못 봤다.

%23%23%23%5BReact%5DReact%uC758%20Component%uC5D0%20%uB300%uD558%uC5EC%0A@%28Postach.io%29%5Breact%2C%20component%2C%20published%2C%20React%5D%0A%0A**React**%uC5D0%uC11C%20%uAC00%uC7A5%20%uC911%uC694%uD55C%uAC8C%20%uBB34%uC5C7%uC774%uB0D0%20%uBB3B%uB294%uB2E4%uBA74%20%uB2F9%uC5F0%uD788%20**Component**%20%uC77C%20%uAC83%uC774%uB2E4.%20React%uC758%20Component%uB294%20Angular%uC758%20Directive%uC640%20%uB9E4%uC6B0%20%uC720%uC0AC%uD558%uB2E4.%20%uC774%20**Component**%uB294%20%uD558%uB098%uC758%20%uBAA8%uB4C8%uC778%uB370%20HTML%2C%20CSS%2C%20JS%20%uBC0F%20%uD574%uB2F9%20%uAD00%uB828%uB41C%20%uB370%uC774%uD130%uB85C%20%uAD6C%uC131%uB418%uC5B4%20%uC788%uB2E4.%20%uBCF4%uD1B5%20React%uC5D0%uC11C%uB294%20**Component**%uAC00%20%60jsx%60%28%uACF5%uC2DD%20%uD29C%uD1A0%uB9AC%uC5BC%uC5D0%uC11C%uB294%20%uC774%uAC78%20%uC4F4%uB2E4.%29%uB85C%20%uB418%uC5B4%20%uC788%uB294%uB370%20%uB098%uC911%uC5D0%20jsx%uB97C%20javascript%uB85C%20%uBCC0%uD658%uD574%uC8FC%uAE30%20%uC704%uD55C%20%uCEF4%uD30C%uC778%20%uB2E8%uACC4%uAC00%20%uD544%uC694%uD558%uB2E4.%0A%0A**React**%uAC00%20UI%uB97C%20%uAD6C%uD604%uD558%uB294%uB370%20%uC788%uC5B4%20%uB9E4%uC6B0%20%uD3B8%uB9AC%uD55C%20%uC774%uC720%uB294%20%uB370%uC774%uD130%uAC00%20**Component**%20%uC790%uCCB4%uC5D0%20%uD3EC%uD568%uB418%uC5B4%20%uC788%uAE30%20%uB54C%uBB38%uC774%uB2E4.%28%uC0C1%uC704%20**Component**%uC5D0%20%uD3EC%uD568%20%uB420%20%uC218%20%uB3C4%20%uC788%uB2E4.%29%20%0A%0A%uCCAB%20%uBC88%uC9F8%20React%20%uAD6C%uC131%20%uC694%uC18C%uB97C%20%uB9CC%uB4E4%uC5B4%20%uBCF4%uC790.%20React%20%uAD6C%uC131%20%uC694%uC18C%uB97C%20%uC0DD%uC131%uD558%uB824%uBA74%20React%20%uAC1D%uCCB4%uC5D0%uC11C%20**createClass**%20%uBA54%uC18C%uB4DC%uB97C%20%uC0AC%uC6A9%uD558%uACE0%20**createClass**%uC5D0%20**Component**%uC5D0%20%uB300%uD55C%20%uC124%uBA85%uC744%20%uC804%uB2EC%uD55C%uB2E4.%0A%0A%60%60%60javascript%0Avar%20React%20%3D%20require%28%27react%27%29%0Avar%20ReactDOM%20%3D%20require%28%27react-dom%27%29%0Avar%20HelloBver%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20Hello%20Bver%21%0A%20%20%20%20%20%20%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0AReactDOM.render%28%3CHelloBver%20/%3E%2C%20document.getElementById%28%27app%27%29%29%3B%0A%60%60%60%0A%0A**createClass**%uC5D0%20%uC804%uB2EC%uD558%uB294%20%uAC1D%uCCB4%uC758%20%uC720%uC77C%uD55C%20%uBA54%uC18C%uB4DC%uB294%20**render**%20%uBA54%uC18C%uB4DC%uC774%uB2E4.%20%uBAA8%uB4E0%20**Component**%uC5D0%uB294%20**render**%20%uBA54%uC11C%uB4DC%uAC00%20%uC788%uC5B4%uC57C%20%uD55C%uB2E4.%20%uB80C%uB354%uB9C1%uC758%20%uC5ED%uD560%uC740%20**Component**%uC758%20%uD15C%uD50C%uB9BF%uC5D0%20%uC6B0%uB9AC%uAC00%20%uC6D0%uD558%uB294%20%uB370%uC774%uD130%uB97C%20%uBFCC%uB824%uC8FC%uAE30%20%uC704%uD568%uC774%uB2E4.%20%uC870%uC2EC%uD560%20%uC810%uC740%20%uC660%uB9CC%uD558%uBA74%20return%uC744%20%28%29%uB85C%20%uAC10%uC2F8%uC8FC%uC790.%20%28%uC2B5%uAD00%uCC98%uB7FC%20%uD574%uC8FC%uC790.%29%20%uC704%20%uC608%uC81C%uC5D0%uC11C%20**Component**%uAC00%20%uB80C%uB354%uB9C1%uB418%uBA74%20%uD654%uBA74%uC5D0%20%uD45C%uC2DC%20%uB420%20%uD14D%uC2A4%uD2B8%uB294%20%60Hello%20Bver%21%60%uC774%uB2E4.%20%0A%0A%uC704%uC758%20%uCF54%uB4DC%uC5D0%uC11C%60React.createClass%60%20%uC0DD%uC131%uC790%uB97C%20%uD638%uCD9C%20%uD55C%20%uACB0%uACFC%uB97C%20%60HelloBver%60%uB77C%uB294%20%uBCC0%uC218%uC5D0%20%uC800%uC7A5%uD588%uB2E4.%20%60ReactDOM.render%60%uB294%20%uB450%20%uAC1C%uC758%20%uC778%uC218%uB97C%20%uBC1B%uB294%uB370%20**%uB79C%uB354%uB9C1%20%uD560%20component**%uC640%20**component%uB97C%20%uB79C%uB354%uB9C1%20%uD560%20DOM%20%uB178%uB4DC**%uC774%uB2E4.%28React.render%uAC00%20%uC544%uB2CC%20ReactDOM.render%uB97C%20%uC0AC%uC6A9%uD558%uACE0%20%uC788%uC74C%uC744%20%uC8FC%uBAA9%uD558%uC790%29%20%uC704%uC758%20%uC608%uC81C%uC5D0%uC11C%20HelloBver%20component%uB97C%20%uAC00%uC838%uC640%20ID%uAC00%20app%20%uC778%20%uC694%uC18C%uC5D0%20%uB80C%uB354%uB9C1%uD558%uB3C4%uB85D%20React%uC5D0%20%uC9C0%uC2DC%uD588%uB2E4.%20React%uC758%20%uD2B9%uC9D5%uC740%20%uBD80%uBAA8%20component%uC5D0%20%uB79C%uB354%uB9C1%uD558%uBA74%20%uBAA8%uB4E0%20%uD558%uC704%20%uC790%uC2DD%20component%uB3C4%20%uB79C%uB354%uB9C1%20%uB418%uAE30%20%uB54C%uBB38%uC5D0%20%60ReactDOM.render%60%uB294%20%uC6F9%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC5D0%uC11C%20%uD55C%20%uBC88%uB9CC%20%uC0AC%uC6A9%uD574%uC57C%uD55C%uB2E4.%20%uB9CC%uC57D%20%uC804%uCCB4%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC744%20React%uB85C%20%uB9CC%u3137%uB974%uB824%uBA74%20component%uB97C%20document.body%uC5D0%20%uB79C%uB354%uB9C1%20%uD558%uBA74%20%uB41C%uB2E4.%0A%0A%uC608%uC81C%uB97C%20%uC790%uC138%uD788%20%uC0B4%uD3B4%uBCF4%uBA74%20%uC774%uC0C1%uD55C%20%uC810%uC774%20%uC788%uB2E4.%20%uBC14%uB85C%20JavaScript%uC5D0%20%22HTML%22%uC774%20%uC874%uC7AC%uD55C%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%uC774%uAC83%uC740%20*React*%uB9CC%uC758%20%uD2B9%uC9D5%uC774%uB2E4.%20%20render%20%uBA54%uC18C%uB4DC%uC5D0%uC11C%20%uC791%uC131%uD558%uB294%20%22HTML%22%uC740%20%uC2E4%uC81C%20HTML%uC774%20%uC544%uB2C8%uC9C0%uB9CC%20React%uAC00%20%22JSX%22%uB97C%20%uD638%uCD9C%uD558%uB294%20%uAC83%uC774%uB2E4.%20JSX%uB97C%20%uC0AC%uC6A9%uD558%uBA74%20%uAC00%uBCBC%uC6B4%20JavaScript%20%uAC1D%uCCB4%uB85C%20%uBCC0%uD615%uB41C%20HTML%20%uAD6C%uBB38%uC744%20%uC791%uC131%uD560%20%uC218%20%uC788%uB2E4.%20%uADF8%uB7F0%20%uB2E4%uC74C%20React%uB294%20%uC774%uB7EC%uD55C%20JavaScript%20%uAC1D%uCCB4%uB97C%20%uAC00%uC838%20%uC640%uC11C%20%uC2E4%uC81C%20DOM%uC758%20%22%uAC00%uC0C1%20DOM%22%uB610%uB294%20JavaScript%20%uD45C%uD604%uC744%20%uD615%uC131%uD558%uAC8C%20%uB41C%uB2E4.%20%uC989%2C%20%uC790%uBC14%uC2A4%uD06C%uB9BD%uD2B8%uC758%20%uD798%uC73C%uB85C%20%uD15C%uD50C%uB9BF%uC758%20%uC811%uADFC%uC131%uC744%20%uC5BB%uB294%20%uC7A5%uC810%uC744%20%uC5BB%uAC8C%20%uB41C%uB2E4.%20%uBB3C%uB860%20template%uB97C%20%uAD6C%uBD84%uD558%uC9C0%20%uBABB%uD55C%uC5D0%20%uB530%uB978%20%uAD00%uB9AC%20%uCE21%uBA74%uC5D0%uC11C%uB294%20%uBD88%uB9AC%uD568%uC774%20%uC874%uC7AC%uD55C%uB2E4.%0A%0A%uC544%uB798%20%uC608%uC81C%uB97C%20%uBCF4%uBA74%20Webpack%uC758%20%uBCC0%uD658%20%uD504%uB85C%uC138%uC2A4%uB97C%20%uC2E4%uD589%uD558%uBA74%20JSX%uAC00%20%uBCC0%uD658%uB41C%uB2E4.%0A%0A%60%60%60javascript%0Avar%20HelloWorld%20%3D%20React.createClass%28%7B%0A%20%20displayName%3A%20%22HelloMessage%22%2C%0A%20%20render%3A%20function%28%29%20%7B%0A%20%20%20%20return%20React.createElement%28%22div%22%2C%20null%2C%20%22Hello%20World%22%29%3B%0A%20%20%7D%0A%7D%29%3B%0A%60%60%60%0A%0A%uC704%uCC98%uB7FC%20%uC791%uC131%uD558%uBA74%20%uC774%uC81C%20JSX%20-%3E%20JS%20%uBCC0%uD658%20%uB2E8%uACC4%uB97C%20%uAC70%uCE58%uC9C0%20%uC54A%uACE0%20React%20component%uB97C%20%20%uC791%uC131%uD560%20%uC218%20%uC788%uC9C0%uB9CC%20%uB354%20%uC0B0%uC73C%uB85C%20%uAC04%20%uB290%uB08C%uC774%uB2E4.%20%uCC38%uACE0%uB85C%20%uB0B4%20%uC8FC%uBCC0%20React%20%uAC1C%uBC1C%uC790%20%uC911%uC5D0%uC11C%20JSX%20%uC4F0%uC9C0%20%uC54A%uB294%20%uC0AC%uB78C%uC744%20%uBABB%20%uBD24%uB2E4.