이런저런 IT 이야기
article thumbnail
Published 2023. 5. 23. 22:06
React란? React
반응형

React는 사용자 인터페이스를 구축하기 위한 JavaScript 라이브러리입니다. Facebook에서 개발했으며, 재사용 가능한 UI 컴포넌트를 만들고 이들을 조합하여 복잡한 UI를 구축할 수 있는 기능을 제공합니다. React는 가상 DOM(Virtual DOM)을 사용하여 효율적인 업데이트 처리와 성능 향상을 가능하게 합니다.

React의 주요 개념과 특징은 다음과 같습니다:

  1. 컴포넌트 기반: React는 UI를 작은 독립적인 컴포넌트로 분리하여 관리합니다. 각 컴포넌트는 자체적인 상태(state)와 생명주기(lifecycle) 메서드를 가지며, 재사용성과 유지보수성을 높여줍니다.
  2. 가상 DOM: React는 가상 DOM을 사용하여 UI 업데이트를 처리합니다. 가상 DOM은 메모리 상에 존재하는 가벼운 복제본으로서, 실제 DOM과 동기화되어 변경 사항을 효율적으로 적용합니다. 이를 통해 필요한 부분만 업데이트하고 렌더링 속도를 향상시킬 수 있습니다.
  3. JSX: JSX는 JavaScript의 확장 문법으로, React 컴포넌트의 구조와 로직을 선언적으로 작성할 수 있게 합니다. JSX는 HTML과 유사한 문법을 가지고 있으며, 컴포넌트의 렌더링 결과를 표현합니다.
  4. 단방향 데이터 흐름: React는 데이터의 흐름을 단방향으로 유지합니다. 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하고, 자식 컴포넌트는 전달받은 데이터를 변경하지 않고 사용합니다. 이를 통해 데이터의 흐름을 예측 가능하게 하고 디버깅을 용이하게 합니다.
  5. 생명주기 메서드: React 컴포넌트는 마운트, 업데이트, 언마운트 등의 생명주기 메서드를 가지고 있습니다. 이를 활용하여 컴포넌트의 초기화, 데이터 로딩, 상태 업데이트 등의 작업을 수행할 수 있습니다.
  6. 상태 관리: React는 컴포넌트의 상태(state)를 효과적으로 관리할 수 있는 기능을 제공합니다. 상태는 컴포넌트 내부에서 관리되며, setState() 함수를 사용하여 업데이트할 수 있습니다.
  7. 컴포넌트 간 통신: React 컴포넌트는 부모-자식 관계에서 데이터를 전달하고 상호작용할 수 있습니다. 부모 컴포넌트는 props를 통해 데이터를 자식 컴포넌트에 전달하고, 자식 컴포넌트는 이벤트 핸들러를 통해 부모 컴포넌트와 통신할 수 있습니다.

React는 React 라이브러리 자체와 함께 사용되는 다양한 생태계(React Router, Redux, Axios 등)와도 호환됩니다. 이를 통해 더욱 강력하고 유연한 웹 애플리케이션을 개발할 수 있습니다.


가상 DOM(Virtual DOM)은 React에서 사용되는 개념으로, 메모리에 존재하는 가벼운 복제본의 DOM 구조입니다. 가상 DOM은 실제 DOM과 동기화되어 변경 사항을 효율적으로 감지하고 적용하는 데 사용됩니다.

일반적인 웹 애플리케이션에서는 DOM은 문서의 구조와 내용을 표현하는 객체로서, HTML 요소들을 나타냅니다. 실제 DOM은 브라우저의 메모리에 존재하며, 웹 애플리케이션에서 DOM 조작이 발생하면 브라우저가 렌더링을 업데이트합니다.

하지만 DOM 조작은 비용이 높은 연산이기 때문에, 많은 요소를 동적으로 변경하는 경우 성능 문제가 발생할 수 있습니다. 이때 가상 DOM이 사용됩니다. 가상 DOM은 JavaScript 객체로서 실제 DOM과 유사한 구조를 가지고 있으며, React 컴포넌트의 렌더링 결과를 표현합니다.

React에서 UI를 업데이트할 때, 가상 DOM을 사용하여 변경 사항을 비교하고 실제 DOM에 최소한의 변경만을 적용합니다. 변경 사항을 비교하기 위해 React는 이전 가상 DOM과 새로운 가상 DOM을 비교하고 차이점을 찾아냅니다. 이를 "가상 DOM 갱신"이라고 합니다.

가상 DOM 갱신 과정은 다음과 같이 진행됩니다:

  1. 컴포넌트 업데이트: React 컴포넌트의 상태(state)나 속성(props)이 변경되면, 컴포넌트는 새로운 가상 DOM을 생성합니다.
  2. 가상 DOM 비교: 이전 가상 DOM과 새로운 가상 DOM을 비교하여 변경된 요소를 찾아냅니다. 이때 변경된 요소만을 추적하므로 성능이 향상됩니다.
  3. 실제 DOM 업데이트: 변경된 요소들만을 실제 DOM에 반영합니다. 이를 통해 필요한 부분만 업데이트하고, 불필요한 렌더링을 최소화하여 성능을 개선할 수 있습니다.

가상 DOM의 장점은 다음과 같습니다:

  • 성능 향상: 실제 DOM 조작을 최소화하여 불필요한 렌더링과 리렌더링을 방지하고, 변경 사항의 효율적인 감지와 업데이트를 가능하게 합니다.
  • 크로스 플랫폼 지원: 가상 DOM은 브라우저에 독립적이므로, React 애플리케이션을 여러 플랫폼(웹, 네이티브 등)에서 동일한 개발 경험으로 구축할 수 있습니다.
  • 개발자 경험 개선: 가상 DOM은 React 컴포넌트의 추상화된 표현으로서, 컴포넌트 기반 아키텍처와 조합하여 재사용성과 유지보수성을 높여줍니다.
  • 생태계와 호환성: React와 함께 사용되는 다양한 라이브러리와 도구들은 가상 DOM을 지원하고 이를 기반으로 한 최적화 기법을 제공합니다.

JSX(JavaScript XML)는 React에서 사용되는 JavaScript의 확장 문법입니다. JSX는 React 컴포넌트의 구조와 로직을 선언적으로 작성할 수 있게 해주며, 가독성과 유지보수성을 향상시킵니다. JSX는 HTML과 유사한 구문을 가지고 있지만, JavaScript로 해석됩니다.

JSX의 특징과 사용법을 구체적으로 설명하면 다음과 같습니다:

  1. 컴포넌트 표현: JSX를 사용하여 React 컴포넌트를 선언할 수 있습니다. JSX 문법으로 컴포넌트의 구조와 UI를 정의할 수 있습니다. 컴포넌트는 함수형 컴포넌트나 클래스형 컴포넌트로 작성할 수 있습니다.
  2. XML과 유사한 구문: JSX는 XML과 유사한 구문을 가지고 있어 HTML과 비슷한 모양으로 컴포넌트를 작성할 수 있습니다. 예를 들어, <div>, <span>, <h1>과 같은 HTML 태그를 사용할 수 있습니다.
  3. JavaScript 표현식 삽입: JSX 내에서 중괄호({})를 사용하여 JavaScript 표현식을 삽입할 수 있습니다. 이를 통해 동적인 값이나 변수, 함수 등을 JSX 내에 포함시킬 수 있습니다. 예를 들어, {name}과 같이 중괄호로 감싼 표현식은 해당 값을 출력할 수 있습니다.
  4. 속성(props) 전달: JSX 요소에는 속성(props)을 지정할 수 있습니다. 속성은 HTML 태그의 속성과 유사하게 사용되며, 컴포넌트에 데이터나 설정값을 전달할 수 있습니다. 예를 들어, <MyComponent name="John" age={25} />와 같이 속성을 지정할 수 있습니다.
  5. 조건부 렌더링: JSX 내에서 JavaScript의 조건문과 반복문을 사용하여 동적인 렌더링을 구현할 수 있습니다. 예를 들어, if문이나 삼항 연산자를 사용하여 조건에 따라 다른 JSX를 렌더링할 수 있습니다.
  6. 스타일 지정: JSX에서는 인라인 스타일을 지정할 수 있습니다. CSS 속성과 유사한 구문으로 스타일을 설정할 수 있으며, 중괄호({})를 사용하여 JavaScript 표현식을 포함시킬 수도 있습니다.
  7. 이벤트 처리: JSX에서는 HTML 태그의 이벤트 처리와 유사한 방식으로 이벤트 핸들러를 설정할 수 있습니다. 예를 들어, onClick과 같은 속성에 함수를 할당하여 클릭 이벤트를 처리할 수 있습니다.

JSX는 바벨(Babel)과 같은 도구를 사용하여 일반 JavaScript로 변환됩니다. 이렇게 변환된 JavaScript는 브라우저에서 실행 가능한 코드가 됩니다. React 컴포넌트의 JSX는 JavaScript 객체로 컴파일되며, React는 이를 사용하여 실제 DOM을 조작하고 업데이트합니다.


단방향 데이터 흐름(One-Way Data Flow)은 React에서 사용되는 개념으로, 데이터의 흐름이 일방향으로만 진행되는 패턴입니다. React는 컴포넌트 간에 데이터를 전달하고 상호작용하는 방식에서 이 원칙을 따릅니다.

단방향 데이터 흐름의 주요 특징은 다음과 같습니다:

  1. 데이터의 흐름 방향: 데이터는 항상 상위 컴포넌트에서 하위 컴포넌트로 단방향으로 흐릅니다. 즉, 부모 컴포넌트에서 자식 컴포넌트로만 데이터를 전달할 수 있습니다.
  2. 상태 업데이트: 데이터는 상위 컴포넌트에서 변경되며, 이를 하위 컴포넌트로 전달하여 UI를 업데이트합니다. 하위 컴포넌트는 전달받은 데이터를 읽기 전용으로 사용하고 변경할 수 없습니다.
  3. 단방향 데이터 흐름의 이점:
    • 예측 가능한 데이터 흐름: 데이터의 변경은 항상 상위 컴포넌트에서 시작되므로, 데이터의 흐름을 예측할 수 있습니다.
    • 디버깅 용이성: 단방향 흐름은 데이터의 변경이 한 곳에서만 발생하므로 버그를 추적하고 디버깅하기 쉽습니다.
    • 컴포넌트 재사용성: 단방향 흐름은 각 컴포넌트가 독립적으로 동작하고 데이터에 의존하기 때문에 재사용성이 높아집니다.
  4. 상태 관리 라이브러리와 함께 활용: 복잡한 애플리케이션에서는 상태 관리 라이브러리(예: Redux, MobX)를 사용하여 상태를 중앙에서 관리하고 데이터의 단방향 흐름을 보장할 수 있습니다.

단방향 데이터 흐름은 React의 핵심 원칙 중 하나이며, 컴포넌트 간의 결합도를 낮추고 유지보수성을 향상시키는 데 도움을 줍니다.


React 컴포넌트는 생명주기(lifecycle) 메서드를 가지고 있으며, 이러한 메서드들은 컴포넌트의 생성, 업데이트, 제거와 관련된 다양한 단계에서 호출됩니다. 이를 활용하여 컴포넌트의 초기화, 데이터 로딩, 상태 업데이트 등의 작업을 수행할 수 있습니다.

React의 생명주기 메서드는 크게 세 가지 카테고리로 나눌 수 있습니다: 마운트(Mounting), 업데이트(Updating), 언마운트(Unmounting). 각각의 카테고리에서 호출되는 메서드들을 설명하겠습니다.

  1. 마운트(Mounting):
    • constructor(): 컴포넌트의 생성자로서, 초기 상태(state)와 이벤트 핸들러 등을 초기화합니다.
    • static getDerivedStateFromProps(props, state): 초기 렌더링과 업데이트 단계에서 호출되며, 속성(props)의 변화에 따라 상태(state)를 업데이트할 수 있습니다.
    • render(): 컴포넌트의 UI를 반환합니다.
    • componentDidMount(): 컴포넌트가 실제 DOM에 추가된 후에 호출됩니다. 이 단계에서 데이터 로딩이나 외부 API 호출과 같은 작업을 수행할 수 있습니다.
  2. 업데이트(Updating):
    • static getDerivedStateFromProps(props, state): 업데이트 단계에서 호출되며, 속성(props)의 변화에 따라 상태(state)를 업데이트할 수 있습니다.
    • shouldComponentUpdate(nextProps, nextState): 컴포넌트의 업데이트를 결정하는 메서드로, true 또는 false를 반환합니다. 기본적으로 모든 업데이트를 허용하며, 성능 최적화를 위해 사용됩니다.
    • render(): 컴포넌트의 UI를 반환합니다.
    • getSnapshotBeforeUpdate(prevProps, prevState): 실제 DOM에 업데이트가 반영되기 직전에 호출됩니다. 이 메서드에서 반환된 값은 componentDidUpdate()에서 사용할 수 있습니다.
    • componentDidUpdate(prevProps, prevState, snapshot): 업데이트가 완료된 후에 호출됩니다. 이 단계에서 DOM 조작이나 외부 라이브러리와의 상호작용을 처리할 수 있습니다.
  3. 언마운트(Unmounting):
    • componentWillUnmount(): 컴포넌트가 제거되기 직전에 호출됩니다. 이 단계에서 이벤트 핸들러 해제, 타이머 정리 등의 정리 작업을 수행할 수 있습니다.

이 외에도 React 17 이전 버전에서 사용되던 여러 생명주기 메서드가 있었지만, 최신 버전의 React에서는 일부 메서드가 제거되거나 변경되었습니다. React 공식 문서에서 해당 버전에 맞는 생명주기 메서드를 확인하는 것이 좋습니다.

생명주기 메서드를 사용하여 컴포넌트의 생명주기 동안 필요한 작업을 수행하고, 컴포넌트의 상태와 동작을 관리할 수 있습니다.

반응형

'React' 카테고리의 다른 글

Redux란  (0) 2023.05.23
profile

이런저런 IT 이야기

@이런저런 IT 이야기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...

검색 태그