04 컴포넌트 만들기

05 props

 

4장의 컴포넌트(component)와 5장의 props는 OOP(Object-Oriented Programming) 패러다임으로 투사해보면 각각 객체와 멤버변수(혹은 속성) 또는 메소드 인자에 대응시켜 볼 수 있겠다. 실제 팀원들이 제작한 FE 코드를 리뷰했을 때 내 기준으로는 관념적으로 동일했다.

일단 컴포넌트는 아래와 같은 html 코드가 있을 경우

<html>
  <header className="header">
    <nav>
      <ul className="nav-list">
        <li>Home</li>
        <li>Projects</li>
        <li>About</li>
        <li>Contact</li>
      </ul>
    </nav>
  </header>
</html>

아래처럼 서브루틴화 하는 것이었다.

function Header() {
  return (
    <header className="header">
      <nav>
        <ul className="nav-list">
          <li>Home</li>
          <li>Projects</li>
          <li>About</li>
          <li>Contact</li>
        </ul>
      </nav>
    </header>
  );  
}

function App() {
  return (
    <Header />
  );
}

여기서 App() 함수는 C/C++의 main() 같은 entry function이다. 그 안의 Header가 바로 컴포넌트다(엄밀히 말하면 App 역시 컴포넌트). 구조를 보면 컴포넌트끼리 has-a 또는 is-a 관계 성립이 가능해 보인다.

 

props는 컴포넌트에 전달할 인자라고 생각하면 되더라. props는 properties의 준말로 보인다. 용법을 보았을 때는 함수의 매개변수라고 칭해도 무방할 듯. 인자로 들어갈 자료형은 js가 제공하는 자료형 모두 가능한 것 같다. immutable이므로 컴포넌트가 수정을 가할 수 없다(이 부분이 마음에 드네).

위의 연습 코드에 prop을 간단히 적용해 보면

function Header(props) {
  return (
    <header className="header">
      <nav>
        <ul className="nav-list">
          <li>Home</li>
          <li>Projects</li>
          <li>About</li>
          <li>Contact</li>
          <li>{props.Other}</li>
        </ul>
      </nav>
    </header>
  );  
}

function App() {
  return (
    <Header Other = 'Custom' />
  );
}

익숙한 구조가 보인다.

 


교재에는 배열 데이타를 이용해 li 태그를 동적으로 생성하는 코드를 예시로 들었는데, 이럴 경우에는 key라는 prop이 필요하다고 한다. 예를 들면

<li key=... > text </li>

이런 식이다. GPT에게 물어보니 리액트의 가상DOM(Document Object Model)이 list 갱신 시 통째로 갱신하지 않고 변경된 부분만 갱신할 수 있도록 하기 위함이라고 한다. 즉, 성능 향상을 위한 정보.

 

 

 

 

 

 

 

Posted by JMAN