첫 번째 클래스 컴포넌트의 코드

472025년 10월 01일3

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)를 연결하는 다리 역할을 합니다. ‘greetingElementroot라는 실제 DOM 노드에 그려주세요’라고 명령하는 거죠.”

코드는 더없이 명확했다.
컴포넌트를 정의하고(createClass), 그것을 사용해서 엘리먼트를 만들고(createElement), 화면에 그린다(render).
이 세 단계의 흐름은 앞으로 리액트로 만들어질 모든 애플리케이션의 기본 구조가 될 터였다.

이 단순한 코드는 리액트가 지향하는 모든 것을 담고 있었다. 선언적인 render 함수, 버추얼 DOM, 그리고 컴포넌트 기반의 조립.
최초의 리액트 클래스 컴포넌트가 탄생하는 역사적인 순간이었다.