웹 개발/프론트엔드 개발

React 컴포넌트와 일반 함수의 모든 가능한 경우의 수 정리

Blue_bull 2025. 2. 12. 09:34

React 컴포넌트와 일반 함수의 모든 가능한 경우의 수 정리

🚀 가능한 모든 경우를 포함하여 React 컴포넌트에서 발생할 수 있는 오류와 허용되는 반환값을 체계적으로 정리했습니다.


🔹 React 컴포넌트 vs. 일반 함수 - 가능한 모든 경우 (오류 여부 포함)

경우 첫 글자 대문자? JSX 반환? <컴포넌트명 /> 사용 가능? 오류 여부 React 컴포넌트 여부 예제
✅ 정상적인 React 컴포넌트 ✅ O ✅ O ✅ O ❌ 오류 없음 ✅ React 컴포넌트 function MyComponent() { return <h1>Hello</h1>; }
❌ JSX를 반환하지 않음 (일반 함수) ✅ O ❌ X ❌ X ❌ 오류 없음 ❌ 일반 함수 function NotAComponent() { return 42; }
❌ JSX를 반환하지만 <컴포넌트명 /> 형태로 사용되지 않음 ✅ O ✅ O ❌ X ❌ 오류 없음 ❌ 일반 함수 return MyComponent(); (직접 호출)
❌ JSX 대신 숫자 반환 ✅ O ❌ X ✅ O ❌ 오류 없음 (숫자는 렌더링됨) ❌ 일반 함수 function MyComponent() { return 42; }
❌ JSX 대신 객체 반환 ✅ O ❌ X ✅ O ✅ 오류 발생 ❌ 일반 함수 function MyComponent() { return {}; }
❌ JSX 대신 함수 반환 ✅ O ❌ X ✅ O ✅ 오류 발생 ❌ 일반 함수 function MyComponent() { return function() {}; }
undefined 반환 ✅ O ❌ X ✅ O ✅ 오류 발생 ❌ 일반 함수 function MyComponent() { return undefined; }
null 반환 ✅ O ✅ O ✅ O ❌ 오류 없음 ✅ React 컴포넌트 function MyComponent() { return null; }
true 또는 false 반환 ✅ O ❌ X ✅ O ❌ 오류 없음 (React는 무시) ❌ 일반 함수 function MyComponent() { return false; }
<></> (Fragment) 반환 ✅ O ✅ O ✅ O ❌ 오류 없음 ✅ React 컴포넌트 function MyComponent() { return <>Hello</>; }
✅ 빈 배열 [] 반환 ✅ O ✅ O ✅ O ❌ 오류 없음 ✅ React 컴포넌트 function MyComponent() { return []; }
✅ JSX 포함된 배열 반환 ✅ O ✅ O ✅ O ❌ 오류 없음 ✅ React 컴포넌트 function MyComponent() { return [<h1>Hi</h1>, "Text"]; }
❌ 소문자로 시작하는 경우 ❌ X ✅ O ❌ X ✅ 오류 발생 (HTML 태그로 인식됨) ❌ 일반 함수 또는 HTML 태그 function myComponent() { return <h1>Hello</h1>; }
React.createElement() 반환 ✅ O ✅ O ✅ O ❌ 오류 없음 ✅ React 컴포넌트 function MyComponent() { return React.createElement('h1', null, 'Hello'); }
console.log() 실행 후 JSX 반환 없음 ✅ O ❌ X ✅ O ✅ 오류 발생 (MyComponent(...) must return a React element) ❌ 일반 함수 function MyComponent() { console.log("Hello"); }
setTimeout 내부에서 JSX 반환 ✅ O ❌ X ✅ O ✅ 오류 발생 (Functions are not valid as a React child) ❌ 일반 함수 function MyComponent() { setTimeout(() => { return <h1>Hello</h1>; }, 1000); }
✅ JSX가 아닌 JSX-like 문자열 반환 ✅ O ❌ X ✅ O ✅ 오류 발생 (Objects are not valid as a React child) ❌ 일반 함수 function MyComponent() { return "<h1>Hello</h1>"; }
Promise 반환 ✅ O ❌ X ✅ O ✅ 오류 발생 (Objects are not valid as a React child) ❌ 일반 함수 function MyComponent() { return Promise.resolve(<h1>Hello</h1>); }

🔹 추가적인 경우의 수

1️⃣ React.createElement() 사용 시 정상 동작

function MyComponent() {
  return React.createElement('h1', null, 'Hello'); // ✅ 정상 실행
}

📌 React는 내부적으로 JSX를 React.createElement()로 변환하므로, 직접 사용해도 정상 동작함.


2️⃣ console.log() 실행 후 반환값 없음 (오류 발생)

function MyComponent() {
  console.log("Hello");
  // ❌ JSX를 반환하지 않음 → 오류 발생
}

📌 React 컴포넌트는 return이 필요하므로, JSX 또는 null을 반환하지 않으면 오류 발생.


3️⃣ setTimeout 내부에서 JSX 반환 (오류 발생)

function MyComponent() {
  setTimeout(() => {
    return <h1>Hello</h1>; // ❌ React 컴포넌트는 비동기 반환을 허용하지 않음
  }, 1000);
}

📌 비동기적으로 JSX를 반환하면 React가 렌더링할 수 없으므로 오류 발생.

해결 방법: useStateuseEffect를 사용해야 함.

function MyComponent() {
  const [content, setContent] = React.useState(null);

  React.useEffect(() => {
    setTimeout(() => {
      setContent(<h1>Hello</h1>);
    }, 1000);
  }, []);

  return content;
}

📌 이렇게 하면 React가 상태 변화(setState)를 감지하여 다시 렌더링 가능.


4️⃣ JSX 대신 문자열을 반환하는 경우 (오류 발생)

function MyComponent() {
  return "<h1>Hello</h1>"; // ❌ JSX가 아닌 단순 문자열 반환 → 오류 발생 가능
}

📌 React는 문자열을 렌더링할 수 있지만, JSX는 따옴표가 필요하지 않음.
📌 실수로 문자열을 반환하면 React가 이를 JSX로 인식하지 않아 오류 발생할 가능성이 있음.

해결 방법: JSX를 반환해야 함.

function MyComponent() {
  return <h1>Hello</h1>;
}

5️⃣ Promise 반환 (오류 발생)

function MyComponent() {
  return Promise.resolve(<h1>Hello</h1>); // ❌ 오류 발생 (React는 비동기 반환을 허용하지 않음)
}

📌 React는 비동기 반환을 지원하지 않으므로, Promise 객체를 반환하면 오류 발생.
📌 useEffectuseState를 사용하여 비동기 데이터를 처리해야 함.


🔥 결론

🚀 React 컴포넌트가 되려면?

  • 첫 글자가 대문자
  • JSX 또는 null 반환
  • <컴포넌트명 /> 형태로 사용 가능해야 함
  • 🚨 객체, 함수, undefined, Promise, setTimeout 내부의 JSX 반환 → 오류 발생

즉, React 컴포넌트의 모든 경우를 고려하여, 오류 없이 렌더링되도록 주의해야 합니다! 😊