2 분 소요

컴포넌트란?

잠재적으로 재사용이 가능한 HTML 과 CSS, 관련된 Javascript 로직들을 감싼 코드 블록
복잡한 사용자 인터페이스를 관리하기 쉽도록 작게 분리하여 UI의 다른 위치에서도 사용할 수 있게 해준다.

왜 컴포넌트를 사용하나요?

코드의 재사용성, 유지보수성을 높이고, UI를 효율적으로 관리하기 위해서!

1. Reusable Building Block

여러 곳에서 반복적으로 재사용이 가능해 코드 중복을 줄일 수 있다.

유사한 코드가 대체로 함께 묶여있어 한부분에서 수정이 가능하기 때문에 오류 위험 적고, 개발 과정이 단순해진다.

3. Separation of Concerns

개발 원칙을 따르면서도 디자인 시스템과 UI 일관성 유지를 지원한다.

JSX

( javascript Syntax Extension 자바스크립트 문법 확장자 )

  • React에서 HTML을 작성하는 것처럼 보이지만, 실제로는 JavaScript 코드로 변환되는 문법
  • 자바스크립트 파일 내에 HTML 코드를 작성하기 때문에 구조를 쉽게 파악할 수 있다.
  • UI 선언이 직관적이고 유지보수하기 쉽다.
  • 브라우저에서는 사용이 불가능하다(브라우저에서 지원되지 않는 파일 확장자)

리엑트의 컴포넌트 처리 과정 & 컴포넌트 트리 생성법

1. 컴포넌트 함수 실행

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

//ReactDOM.createRoot()를 사용하여 루트 컴포넌트를 렌더링
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
function App() {
  // 최상위 컴포넌트(App)를 실행하고 JSX 반환값을 가상 DOM으로 변환(컴포넌트 트리 구성)
  return (
    <div>
      <Header />
      <Main />
      <Footer />
    </div>
  );
}

2. 컴포넌트 트리를 바탕으로 가상 DOM 생성

컴포넌트 트리란?

React가 컴포넌트 간 계층 구조를 생성하여 UI를 구성하는 방식, 리엑트는 해당 구조를 메모리에 저장하고 변경 사항을 감지

App //부모(루트) 컴포넌트
 ├── Header
 ├── Main
 └── Footer
 //Header,Main,Footer 자식 컴포넌트

3. 가상 DOM 기반으로 실제 DOM 업데이트

이전 Virtual DOM과 새로운 Virtual DOM을 비교하여 변경된 부분의 DOM만 업데이트, 변경

const reactDeacriptions = ["a","b","c"]
function getRandomNumber (max){
	return Math.floor(Math.random() * (max * 1))
}
function Header(){
const description = reactDescriptions[getRandomNumber(2)]
	return(
		<p>{description}...</p>
	)
}
//헤더에 변경사항이 있다면 Header 컴포넌트를 다시 실행하여 새로운 가상DOM을 만든다.

App
 ├── Header // ✅ 이전 가상DOM과 새로운 가상DOM을 비교해 변경된 부분만 감지하여 실제 DOM 업데이트!
 ├── Main
 └── Footer

💡 리렌더링 ≠ DOM 업데이트

React에서 부모가 리렌더링되면 모든 자식이 다시 렌더링되는 것이 기본 동작이지만 React에서 리렌더링과 DOM업데이트는 다르며 렌더링이 반드시 실제로 DOM을 변경하는 것은 아니다.

리렌더링 (Re-rendering) DOM 업데이트 (Commit Phase)
- 컴포넌트 함수를 다시 실행하는 것, 새로운 UI를 만들기 위해 Virtual DOM을 다시 계산하는 과정 - Virtual DOM에서 변경된 부분만 찾아서 실제 DOM을 업데이트하는 과정
- 모든 자식 컴포넌트도 기본적으로 다시 실행되나 결과가 바뀌지 않으면 실제 DOM을 업데이트하지 않음 - 변경된 부분이 없으면 실제 DOM 변경 없음
import { useState } from "react";

function Parent() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      /* 부모 컴포넌트가 변경되면, 모든 자식 컴포넌트는 자동으로 리렌더링된다. props를
      전달받은 ChildB는 변경된 부분의 DOM이 업데이트 되며, props를 받지 않은 ChildA
      는 리렌더링되지만 동일한 JSX를 반환하기 때문에 DOM 변경, 업데이트를 하지 않음
      */
      <ChildA />
      <ChildB count={count} />
    </div>
  );
}

댓글남기기