HancomAI_academy/React

11. 조건부 렌더링 (Conditional Rendering)

k1212gh 2025. 3. 3. 02:26

[스나이퍼팩토리] 한컴AI - AI개발자 교육 React.js 11차시: 조건부 렌더링 (Conditional Rendering)


📌 학습 목표

✅ **조건부 렌더링(Conditional Rendering)**의 개념을 깊이 이해한다.
✅ JSX에서 if 문, 삼항 연산자(? :), 논리 연산자(&&, ||) 등을 활용하여 다양한 방법으로 조건부 렌더링을 구현한다.
실제 React 컴포넌트에서 조건부 렌더링을 적용하여 동적인 UI를 만들어 본다.
불필요한 렌더링을 방지하는 최적화 기법을 학습하고 적용한다.
✅ 조건부 렌더링을 다른 React 기능 (useState, useEffect, React.lazy, Suspense 등)과 함께 활용하는 방법을 익힌다.


📚 학습 내용

1. 조건부 렌더링이란?

  • 조건부 렌더링(Conditional Rendering)특정 조건에 따라 UI를 다르게 렌더링하는 기법이다.
  • React에서는 동적인 UI를 구현할 때 필수적으로 사용되며, 다양한 조건을 기반으로 다른 요소를 표시하거나 숨길 수 있다.
  • 예를 들어, 로그인 상태에 따라 다른 화면을 보여주는 기능을 구현할 수 있다.
  • JavaScript에서 조건문을 사용하듯이, React에서는 JSX에서 조건을 사용하여 특정 UI를 결정한다.

2. 조건부 렌더링의 다양한 방법

🔹 1) if 문을 사용한 조건부 렌더링

function Greeting(props) {
  if (props.isLoggedIn) {
    return <h1>Welcome back!</h1>;
  }
  return <h1>Please sign in.</h1>;
}
  • if 문을 활용하여 조건에 따라 다른 UI를 반환할 수 있다.
  • JSX 외부에서 조건을 체크한 후, JSX 내에서 필요한 요소를 반환하는 방식이다.
  • 조건이 복잡할 경우, 코드 가독성이 좋다.
  • 단점: JSX 내부에서 if 문을 직접 사용할 수 없고, 반드시 JSX 밖에서 조건을 처리해야 한다.

🔹 2) if-else 문을 활용한 조건부 렌더링

function UserStatus(props) {
  if (props.isLoggedIn) {
    return <p>Welcome, {props.username}!</p>;
  } else {
    return <p>Please log in to continue.</p>;
  }
}
  • 두 가지 이상의 조건을 처리할 때 유용하다.
  • JSX 외부에서 조건을 평가하여 적절한 UI를 반환할 수 있다.
  • 코드 가독성이 좋고, 복잡한 조건을 명확하게 표현할 수 있다.

3. JSX 내부에서 조건부 렌더링 구현하기

🔹 1) 삼항 연산자(? :)를 사용한 조건부 렌더링

function Greeting(props) {
  return <h1>{props.isLoggedIn ? "Welcome back!" : "Please sign in"}</h1>;
}
  • 한 줄로 간결하게 조건부 렌더링을 구현할 수 있다.
  • 간단한 조건문을 표현하는 데 적합하지만, 복잡한 조건에서는 가독성이 떨어질 수 있다.
  • 단점: 중첩된 삼항 연산자는 코드 가독성을 해칠 수 있음.
function StatusMessage({ isLoggedIn, hasError }) {
  return (
    <p>
      {hasError
        ? "Something went wrong"
        : isLoggedIn
        ? "Welcome back!"
        : "Please log in"}
    </p>
  );
}
  • 위와 같이 삼항 연산자가 중첩될 경우 if-else 문을 사용하는 것이 가독성이 더 좋을 수 있다.

🔹 2) 논리 연산자(&&)를 사용한 조건부 렌더링

function Notifications(props) {
  return (
    <div>
      {props.unreadMessages.length > 0 && (
        <h2>You have {props.unreadMessages.length} unread messages.</h2>
      )}
    </div>
  );
}
  • && 연산자를 사용하면 조건이 참일 경우에만 특정 요소를 렌더링할 수 있다.
  • falsy 값(예: false, 0, null, undefined, "")이면 아무것도 렌더링되지 않는다.

🔹 3) 논리 연산자(||)를 사용하여 기본값 설정

function Welcome(props) {
  return <h1>Hello, {props.name || "Guest"}!</h1>;
}
  • || 연산자를 활용하면 props 값이 없을 경우 기본값을 설정할 수 있다.

4. 조건부 렌더링의 활용 사례

✅ 1) 로그인 상태에 따른 UI 변경

function Header(props) {
  return (
    <header>
      {props.isLoggedIn ? (
        <UserMenu username={props.username} />
      ) : (
        <LoginButton />
      )}
    </header>
  );
}
  • 로그인 여부에 따라 다른 컴포넌트를 렌더링하는 예제이다.

✅ 2) 데이터 로딩 상태 표시

function DataList(props) {
  if (props.isLoading) {
    return <LoadingSpinner />;
  }
  if (props.error) {
    return <ErrorMessage message={props.error} />;
  }
  return (
    <ul>
      {props.items.map((item) => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}
  • 데이터를 불러오는 동안 로딩 스피너를 보여주거나, 에러 메시지를 표시하는 예제이다.

💡 추가로 알면 좋은 사항

🔹 조건부 렌더링 최적화

  • 불필요한 렌더링 방지
    • 조건부 렌더링을 사용할 때, **React.memo()**와 같은 최적화 기법을 활용하면 성능을 개선할 수 있다.
const ExpensiveComponent = React.memo(({ isVisible }) => {
  console.log("Rendering Expensive Component");
  return isVisible ? <div>Expensive Component</div> : null;
});
  • React.memo()를 사용하면 Props가 변경되지 않는 한 다시 렌더링되지 않도록 최적화할 수 있다.

🔹 Suspense를 활용한 비동기 렌더링

import React, { Suspense } from "react";

const LazyComponent = React.lazy(() => import("./LazyComponent"));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}
  • 비동기적으로 데이터를 로드할 때 Suspense를 사용하면 렌더링 성능을 향상시킬 수 있다.

🔎 학습 회고

조건부 렌더링을 활용하면 동적인 UI를 쉽게 구현할 수 있다.
✅ if 문, 삼항 연산자, 논리 연산자(&&, ||) 등을 적절하게 활용해야 한다.
불필요한 렌더링을 방지하는 방법(React.memo(), Suspense)을 알게 되었다.
✅ 앞으로 Context API 및 Redux와 연계하여 더 복잡한 상태 관리를 해보고 싶다.

'HancomAI_academy > React' 카테고리의 다른 글

18.커스텀 훅 (Custom Hooks)  (0) 2025.03.03
17. useEffect 훅 (Hook)  (0) 2025.03.03
9. State와 useState  (0) 2025.03.03
8. Props의 이해와 활용  (0) 2025.03.02
13. React.js 컴포넌트 디자인 패턴  (1) 2025.02.23