API 설계가 구체화되자, 조던 워크는 팀원들 앞에서 리액트의 핵심 철학이 담긴 첫 번째 공식 예제 코드를 작성하기 시작했다. 그는 가장 단순하지만, 리액트의 모든 것을 설명할 수 있는 ‘Hello, World’ 메시지를 출력하는 컴포넌트를 만들기로 했다.
“자, 이제 우리는 React.createClass를 이용해서 <Greeting>이라는 부품을 만들어 보겠습니다.”
조던은 키보드를 두드리며, 그의 생각을 코드로 옮겼다. 화면에 나타난 코드는 놀랍도록 간결했다.
// Greeting 컴포넌트의 설계도를 정의한다.
var Greeting = React.createClass({
// 이 컴포넌트가 화면에 어떻게 보여야 하는지를 정의하는
// 'render' 메서드는 필수입니다.
render: function() {
// render 메서드는 버추얼 DOM 노드를 반환해야 합니다.
// 여기서는 'h1' 태그를 표현하는 객체를 반환합니다.
return React.createElement('h1', null, 'Hello, World!');
}
});
그는 코드 한 줄 한 줄을 팀원들에게 설명했다.
var Greeting = React.createClass({ ... });
- “우리는
Greeting이라는 변수에 컴포넌트 ‘설계도’를 저장합니다. 이 설계도는React.createClass라는 공장 기계가 만들어준 것입니다.”
render: function() { ... }
- “이 공장 기계에 우리가 넣어주는 유일한 필수 재료는 바로
render라는 이름의 메서드입니다. 이 메서드는 이 부품이 화면에 어떻게 그려져야 하는지를 알려주는 역할을 합니다. 리액트는 이 부품을 화면에 그려야 할 때마다 이render메서드를 호출할 겁니다.”
return React.createElement('h1', null, 'Hello, World!');
- “
render메서드는 실제 HTML 문자열이 아닌, 버추얼 DOM 노드를 반환해야 합니다.React.createElement는 그 버추얼 DOM 노드, 즉 UI 설명서 객체를 만들어주는 헬퍼 함수입니다.” - “첫 번째 인자는 태그 이름(
h1), 두 번째 인자는 속성(여기서는 없음), 세 번째 인자는 자식 요소(Hello, World!텍스트)를 의미합니다. 이 함수는 결국{ tagName: 'h1', properties: null, children: ['Hello, World!'] }와 같은 순수한 자바스크립트 객체를 만들어낼 뿐입니다.”
이제 설계도는 완성되었다. 다음은 이 설계도를 이용해 실제 부품을 만들어 화면에 부착하는 과정이었다.
// 1. Greeting 설계도를 이용해 실제 컴포넌트 인스턴스(엘리먼트)를 생성한다.
var greetingElement = React.createElement(Greeting, null);
// 2. 생성된 엘리먼트를 실제 DOM의 'root'라는 ID를 가진 요소에 렌더링한다.
ReactDOM.render(greetingElement, document.getElementById('root'));
React.createElement(Greeting, null)
- “여기서 우리는
h1같은 문자열 대신, 방금 만든Greeting설계도 자체를 첫 번째 인자로 넘깁니다. 리액트는 이것을 보고 ‘아, 이건 내가 직접 그릴 HTML 태그가 아니라, 다른 컴포넌트를 렌더링하라는 뜻이구나’라고 이해합니다.”
ReactDOM.render(...)
- “마지막으로,
ReactDOM.render함수가 이 모든 과정을 시작하는 출발점입니다. 이 함수는 리액트의 세계(버추얼 DOM)와 현실 세계(실제 DOM)를 연결하는 다리 역할을 합니다. ‘greetingElement를root라는 실제 DOM 노드에 그려주세요’라고 명령하는 거죠.”
코드는 더없이 명확했다.
컴포넌트를 정의하고(createClass), 그것을 사용해서 엘리먼트를 만들고(createElement), 화면에 그린다(render).
이 세 단계의 흐름은 앞으로 리액트로 만들어질 모든 애플리케이션의 기본 구조가 될 터였다.
이 단순한 코드는 리액트가 지향하는 모든 것을 담고 있었다. 선언적인 render 함수, 버추얼 DOM, 그리고 컴포넌트 기반의 조립.
최초의 리액트 클래스 컴포넌트가 탄생하는 역사적인 순간이었다.


