React 프레임워크 기반으로 프론트엔드 개발을 한 지 어느덧 2년이 조금 넘어가는 시기.
그동안 React에 대해 얼마나 제대로 잘 알고 있는지 회고를 해본 결과, 막상 명확하게 설명할 수 있는 부분이 많이 없는 것 같았다.
그래서 더 늦기 전에 공식 문서를 기반으로 React의 본질적인 기능과 원리를 공부해보기로 다짐했다.
이번 포스트에서 배울 수 있는 내용은 아래와 같다.
컴포넌트란 React 의 핵심 개념 중 하나이며, 기능별로 컴포넌트를 작성하여 재사용성, 유지보수성 두 가지 SW 특성을 유지할 수 있다.
React의 Component에서는 또 다른 Component를 불러와서(import) 사용할 수 있는데, 예를 들면 아래와 같다.
예시
Album 이라는 컴포넌트에 사용자들의 프로필 정보를 담고 있는 Profile 컴포넌트를 삽입하고 싶은 경우
// src/components/Profile.jsx
export default function Profile {
return (
<img src='#' alt="userPhoto"/>
)
}
// src/components/Album.jsx
import Profile from './Profile'
const Album = () => {
return (
<ul>
<li>
<Profile />
</li>
</ul>
)
};
export default Album;
💡 React Component는 이름이 대문자로 시작하여야 한다.
💡 React Component의 return 구문을 소괄호(()
) 로 묶어야한다.
앞에 예시 코드들을 기반으로 아래와 같은 jsx 구문이 있다고 생각해보자.
import Profile from './Profile';
const Album = () => {
return (
<ul>
<li><Profile/></li>
<li><Profile/></li>
<li><Profile/></li>
</ul>
)
};
export default Album;
브라우저는 위의 코드를 다음과 같이 일반 HTML 구문처럼 인식한다.
import Profile from './Profile';
const Album = () => {
return (
<ul>
<li>
<img src='#' alt="userPhoto"/>
</li>
<li>
<img src='#' alt="userPhoto"/>
</li>
<li>
<img src='#' alt="userPhoto"/>
</li>
</ul>
)
};
export default Album;
❗️ 특정 컴포넌트 내부 스코프에 또다른 컴포넌트를 정의하지 않도록 한다.
const Album = () => {
// 🚫 Bad
const Profile = () => {
return <img src='#' alt="userPhoto"/>;
};
return (
<ul>
<li><Profile/></li>
<li><Profile/></li>
<li><Profile/></li>
</ul>
)
}
export default Album;
위와 같이 특정 컴포넌트 내부에 또다른 서브 컴포넌트를 정의할 경우, 렌더링 속도가 매우 느려지거나 예기치 못한 버그를 유발할 수 있다고 한다.
따라서, 특정 컴포넌트 내부에 또다른 서브 컴포넌트를 정의하려면 아래와 같이 가장 최상위 스코프에 정의해야한다.
// 🟢 Good
const Profile = () => {
return <img src='#' alt="userPhoto"/>;
};
const Album = () => {
return (
<ul>
<li><Profile/></li>
<li><Profile/></li>
<li><Profile/></li>
</ul>
)
}
export default Album;
🔎 React를 통해 재사용 가능한 UI Component를 만들 수 있다.
🔎 React 앱에서 모든 UI 부분은 Component 이다.
🔎 React Component는 다음을 제외하면 그저 일반 JS 함수일 뿐이다.