Component
- 리액트는 컴포넌트 기반 구조이다.
- 레고 블록처럼 컴포넌트를 조립해서 개발
- 컴포넌트는 함수(function)와 형태가 비슷하다. 입력(props) 값을 받아서 react element로 반환을 한다.
Componenet와 react element 간의 관계는 붕어빵 틀과 붕어빵의 관계다.
객체지향에서 나오는 클래스와 인스턴스의 관계와 흡사하다.
Props
- Property를 줄여서 사용
- 리액트 컴포넌트의 속성을 의미한다.
- 컴포넌트에 전달한 다양한 정보를 담고 있는 자바스크립트 객체
- 붕어빵에 들어가는 속재료

Props의 특징
- read-only : 읽기만 할 수 있고, 변경은 불가능하다.
- 모든 리액트 컴포넌트는 Props에 관해서는 Pure함수 같은 역할을 해야 한다.
Props 사용법
function App(props) {
return (
<Profile
name="홍길동"
introduction="안녕하세요, 홍길동입니다"
viewCount={1500}
/>
);
}
function App(props) {
return (
<Layout
width={2560}
height={1440}
header={
<Header title="홍길동의 블로그입니다." />
}
footer={
<Footer />
}
/>
);
}
Component 만들기 및 렌더링
Component 만들기
- 리액트에서 컴포넌트는 클래스 컴포넌트와 함수 컴포넌트로 나뉜다. 클래스 컴포넌트는 초기에 많아 사용했지만 현재 대부분 함수 컴포넌트를 사용한다.
Function Component (간단한 코드가 장점)
function welcome(props) {
return <h1>안녕, {props.name}</h1>;
}
Class Component(ES6의 클래스를 이용)
class Welcome extends React.Component {
render() {
return <h1>안녕, {this.props.name}</h1>;
}
}
- React.Component를 항상 상속받는다.
Component의 이름은 항상 대문자로 시작해야 한다. 소문자로 시작하면 리액트가 컴포넌트가 아닌 DOM 태그로 인식한다.
const element = <div />; // DOM 태그
const element = <Welcome name="인제" />;
// 만약 소문자면 DOM 태그로 인식한다.
Component 렌더링
- 컴포넌트는 붕어빵 틀이다.
- 실제로 화면에 보이려면 컴포넌트로부터 Element를 만들어야 한다.
function Welcome(props) {
return <h1>안녕, {props.name}</h1>;
}
const element = <Welcome name="인제" />;
ReactDOM.render(
element,
document.getElementById('root')
);
- 리액트돔의 render 함수를 호출하여 리액트 엘리먼트를 실제 DOM에 업데이트한다.
컴포넌트 합성과 추출
컴포넌트 합성
- 여러 개 컴포넌트를 합쳐서 하나의 컴포넌트를 만드는 것
- 복잡한 화면을 여러 개의 컴포넌트를 합쳐서 구성할 수 있다.
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
function App(props) {
return (
<div>
<Welcome name="Mike" />
<Welcome name="Steve" />
<Welcome name="Jane" />
</div>
);
}
ReactDOM.render(
<App />,
document.getElementById('root')
);

컴포넌트 추출
- 복잡한 컴포넌트를 쪼개서 여러 개의 컴포넌트로 나누는 것
- 잘 활용하면 재사용성이 증가한다.
function Comment(props) {
return (
<div className="comment">
<div className="user-info">
<img className="avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="user-info-name">
{props.author.name}
</div>
</div>
<div className="comment-text">
{props.text}
</div>
<div className="comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
props = {
author: {
name: "홍길동",
avatarUrl:"https://...",
},
text: "댓글입니다.",
date: Date.now(),
}
위 컴포넌트를 추출해 보자
Avatar 컴포넌트 추출
function Avatar(props) {
return (
<img className="avatar"
src={props.user.avatarUrl}
alt={props.user.name}
/>
);
}
// 추출한 컴포넌트로 변경
function Comment(props) {
return (
<div className="comment">
<div className="user-info">
<Avatar user={props.author} />
<div className="user-info-name">
{props.author.name}
</div>
</div>
<div className="comment-text">
{props.text}
</div>
<div className="comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
author > user 변경 : 재사용성을 위해 보편적인 의미로 변경, User-info 추출
function UserInfo(props) {
return (
<div className="user-info">
<Avatar user={props.user} />
<div className="user-info-name">
{props.user.name}
</div>
</div>
);
}
// 추출한 컴포넌트로 변경
function Comment(props) {
return (
<div className="comment">
<UserInfo user={props.author} />
<div className="comment-text">
{props.text}
</div>
<div className="comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
- 컴포넌트 추출은 기능단위와 재사용이 가능한 단위로 추출하는 것이 좋다.
- 재사용이 가능한 컴포넌트가 많을수록 개발 속도는 빨라진다.
[무료] 처음 만난 리액트(React) - 인프런 | 강의
자바스크립트와 CSS 기초 문법과 함께 리액트의 기초를 탄탄하게 다질 수 있습니다., 깔끔한 강의자료, 꼼꼼한 설명으로쉽게 배우는 리액트 강의입니다. 👨🏫 리액트의 세계로초대합니다 💫
www.inflearn.com