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