본문 바로가기

JavaScript/React.js

1. 리액트 기술적 특징

728x90
반응형

기술 특징

  1. 컴포넌트 기반 UI 렌더링 (독립적인 컴포넌트로 구조화(모듈화) 가능)
  2. 화면 업데이트 구현이 비교적 쉬움 (상태, 속성의 변경 감지시 재렌더링)
    • 선언형 프로그래밍 : 과정은 생략하고 목적만 간결히 명시하는 방법
    • 명령형 프로그래밍 : 절차 중심적으로, 프로세스를 상세히 정의하는 방법
더보기

React의 선언형 프로그래밍과 비교할 만한 반대 개념은 명령형 프로그래밍입니다. 두 프로그래밍 방식은 코드 작성 방식과 사고방식에서 차이가 있습니다. 아래에서 각각의 개념을 설명하고, React와 명령형 프로그래밍의 차이점을 비교해 보겠습니다.


1. 선언형 프로그래밍 (Declarative Programming)

  • 특징:
    • 무엇(What)을 해야 하는지를 설명합니다.
    • 결과 중심적으로, 최종 상태나 목표를 명확히 기술하며, 그 목표를 달성하기 위한 과정은 숨겨져 있습니다.
    • 로직과 상태 관리를 프레임워크나 라이브러리에 맡깁니다.

React에서의 예:

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

      return (
          <div>
              <p>Count: {count}</p>
              <button onClick={() => setCount(count + 1)}>Increase</button>
          </div>
      );
  }

설명:

  • setCount를 호출하면 React가 상태를 변경하고, 변경된 상태를 기반으로 UI를 자동으로 다시 렌더링합니다.
  • 상태 변화에 따른 결과(UI)가 명확히 정의되었으며, DOM 조작의 세부 과정은 React가 처리합니다.

2. 명령형 프로그래밍 (Imperative Programming)

  • 특징:
    • 어떻게(How) 해야 하는지를 단계별로 설명합니다.
    • 절차 중심적으로, 개발자가 프로세스를 상세히 정의하며, 작업의 세부 사항을 명시적으로 기술해야 합니다.
    • 상태 변화와 로직 처리를 개발자가 직접 관리합니다.

예: Vanilla JavaScript로 동일한 UI 구현:

  const app = document.getElementById("app");

  let count = 0;

  function render() {
      app.innerHTML = `
          <div>
              <p>Count: ${count}</p>
              <button id="increase">Increase</button>
          </div>
      `;
      document.getElementById("increase").addEventListener("click", () => {
          count++;
          render();
      });
  }

  render();

설명:

  • 상태(count)와 DOM을 직접 관리하며, 상태가 바뀔 때마다 전체 UI를 다시 그리고, 이벤트 리스너를 다시 등록해야 합니다.
  • UI 변경 과정에서 어떻게 해야 하는지를 직접 기술해야 합니다.

비교

특징선언형 프로그래밍명령형 프로그래밍
접근 방식 결과를 정의 (무엇을 해야 하는지 기술) 절차를 정의 (어떻게 해야 하는지 기술)
추상화 수준 높음: 세부 구현을 숨기고, 로직을 간단히 표현 낮음: 세부 구현을 개발자가 명시적으로 정의
유지보수성 높음: 직관적인 코드로 변경에 유리 낮음: 변경 시 모든 관련 로직을 수정해야 함
코드 복잡도 상대적으로 간결함 상대적으로 복잡함
대표 기술 React, Vue, Angular Vanilla JavaScript, jQuery

React에서 선언형 프로그래밍이 유리한 이유

  • 상태 변화에 따른 UI 동기화를 React가 자동으로 처리하므로, 개발자는 UI의 결과만 신경 쓰면 됩니다.
  • 코드 가독성과 유지보수가 쉬워지고, 대규모 애플리케이션에서도 효율적으로 상태를 관리할 수 있습니다.

요약:
React는 선언형 프로그래밍을 중심으로 설계되었으며, 명령형 방식에 비해 UI 개발을 더 직관적이고 효율적으로 만듭니다. 그러나 간단한 작업에서는 명령형 방식이 적합할 수도 있습니다. 프로젝트의 복잡성과 요구 사항에 따라 두 방식을 적절히 사용할 수 있습니다! 😊

   3. 화면 업데이트를 빠르게 처리 (가상 돔을 이용해 최소한의 변경만 수행)

브라우저의 렌더링 과정

더보기

브라우저 렌더링 과정 자체는 타임리프(SSR) 리액트(CSR) 모두 동일합니다. 브라우저는 HTML, CSS, JavaScript를 받아들인 후 DOM, CSSOM을 생성하고 이를 결합해 Render Tree를 만들고, Layout 및 Painting을 통해 화면에 출력합니다. 이 과정은 브라우저 렌더링 엔진의 기본 동작 원리로, 사용하는 프레임워크나 라이브러리와는 무관합니다.

하지만 HTML과 데이터를 브라우저에 전달하는 방식과 시점이 다르기 때문에, 타임리프와 리액트를 기반으로 렌더링 과정을 비교하여 설명할 수 있습니다.


1. 타임리프와 리액트를 접목한 렌더링 과정 비교

타임리프 (SSR: 서버사이드 렌더링)

  1. 요청 처리
    • 클라이언트가 서버에 페이지 요청을 보냅니다.
      예: 사용자가 /products 경로를 요청.
  2. HTML 템플릿 생성
    • 서버(Spring Boot)가 타임리프 템플릿과 데이터를 조합해 완성된 HTML 파일을 생성합니다.
    • 이 과정에서 th:text, th:each 같은 속성을 사용하여 데이터를 HTML에 삽입합니다.
  3. 완성된 HTML 전달
    • 서버는 완성된 HTML을 클라이언트(브라우저)에 전달합니다.
    • 이때 브라우저는 추가적인 데이터 요청 없이 렌더링을 시작합니다.
  4. 브라우저 렌더링
    • 브라우저가 HTML을 파싱하여 DOM을 생성하고, CSS를 파싱하여 CSSOM을 생성합니다.
    • DOM과 CSSOM을 결합해 Render Tree를 만들고, Layout 및 Painting 단계를 거쳐 화면에 출력합니다.

리액트 (CSR: 클라이언트사이드 렌더링)

  1. 초기 HTML 전달
    • 서버는 초기 HTML 파일을 전달하지만, 이 HTML은 비어 있거나 최소한의 <div id="root"></div> 구조만 포함합니다.
    • 브라우저가 HTML을 파싱하고 DOM을 생성하지만, 초기 단계에서는 렌더링할 콘텐츠가 거의 없습니다.
  2. JavaScript 로드 및 실행
    • 브라우저가 HTML에 포함된 JavaScript 파일(리액트 번들)을 다운로드하여 실행합니다.
    • React 라이브러리는 초기 JavaScript 파일 실행 후 Virtual DOM을 생성하고, 이를 기반으로 화면 구성을 시작합니다.
  3. 동적 DOM 생성
    • React는 상태(state)와 속성(props)에 따라 Virtual DOM을 기반으로 실제 DOM을 동적으로 생성합니다.
    • 변경 사항이 발생하면 Virtual DOM을 비교(diffing)하여 필요한 부분만 실제 DOM에 업데이트합니다.
  4. 브라우저 렌더링
    • 브라우저는 React가 동적으로 생성한 DOM과 CSSOM을 이용해 Render Tree를 만들고, Layout 및 Painting 단계를 거쳐 화면에 출력합니다.

2. 주요 차이점

구분타임리프 (SSR)리액트 (CSR)
HTML 생성 위치 서버에서 HTML을 완성해 브라우저로 전달 브라우저에서 JavaScript가 DOM을 동적으로 생성
초기 로드 속도 서버가 완성된 HTML을 전달하므로 초기 로드가 빠름 JavaScript를 다운로드 및 실행해야 하므로 초기 로드가 느릴 수 있음
렌더링 주체 브라우저가 서버에서 받은 HTML을 렌더링 브라우저가 React를 통해 동적으로 DOM을 생성하고 렌더링
상태 변화 처리 상태 변화 시 새로운 요청을 서버에 보내 HTML을 다시 받아옴 Virtual DOM을 통해 필요한 부분만 업데이트
SEO 적합성 초기 HTML에 콘텐츠가 포함되어 있어 SEO 친화적 초기 HTML이 비어 있을 수 있어 SEO에 불리함 (SSR로 보완 가능)

 


3. 렌더링 과정 통합 비교

두 렌더링 방식을 브라우저 렌더링 과정에 접목하여 비교하면 다음과 같이 설명할 수 있습니다.

타임리프: 서버에서 완성된 DOM 전달

  1. 서버에서 완성된 DOM이 브라우저로 전달.
  2. 브라우저가 DOM과 CSSOM을 생성하여 Render Tree를 만들고 화면에 출력.
  3. 상태 변경 시 브라우저가 새로운 HTML 요청 → 기존 DOM을 완전히 대체.

리액트: 브라우저에서 DOM 생성

  1. 브라우저가 서버에서 받은 HTML을 기반으로 React 앱 초기화.
  2. React가 Virtual DOM을 생성하고, 브라우저가 이를 기반으로 실제 DOM을 동적으로 생성.
  3. 상태 변경 시 Virtual DOM 비교(diffing) → 필요한 부분만 갱신.

4. 요약

  • 타임리프는 브라우저 렌더링 과정 이전에 서버에서 완성된 DOM을 전달하므로 브라우저는 전달된 HTML을 바로 렌더링합니다.
  • 리액트는 초기 HTML이 비어 있거나 최소한의 구조만 전달된 뒤, 브라우저에서 DOM을 동적으로 생성하고 업데이트합니다.
  • 브라우저 렌더링 엔진의 동작(HTML → DOM, CSS → CSSOM → Render Tree → Layout → Painting)은 동일하지만, DOM 생성 및 업데이트 방식에서 차이가 있습니다.

이 차이를 프로젝트의 요구사항(SEO, 초기 로드 속도, 동적 인터랙션)에 따라 선택하면 됩니다! 😊

 

SEO란?

더보기

SEO(Search Engine Optimization, 검색 엔진 최적화)는 웹사이트가 검색 엔진 결과 페이지(SERP: Search Engine Results Page)에서 더 높은 순위에 표시되도록 최적화하는 작업을 의미합니다.

이를 통해 웹사이트에 더 많은 방문자를 유도하고, 검색 트래픽(organic traffic)을 증가시키는 것이 목표입니다.


SEO의 주요 요소

  1. 콘텐츠 품질 및 키워드
    • 사용자가 검색할 가능성이 높은 키워드를 포함한 고품질 콘텐츠를 작성.
    • 콘텐츠가 명확하고 유용해야 함.
  2. 메타 태그 최적화
    • Title 태그 메타 설명(Meta Description)을 적절히 작성해 검색 결과에 매력적으로 표시.
    • 예: <meta name="description" content="...">
  3. URL 구조 최적화
    • URL이 간결하고 키워드를 포함하도록 설계.
    • 예: example.com/blog/react-seo-tips
  4. 모바일 최적화
    • 웹사이트가 모바일 친화적이어야 함. (반응형 디자인, 빠른 로드 속도 등)
  5. 사이트 속도
    • 웹사이트의 로드 속도가 빠를수록 SEO 점수가 높아짐. (검색 엔진은 느린 사이트를 선호하지 않음)
  6. 링크 전략
    • 내부 링크 외부 링크를 적절히 배치하여 웹사이트의 신뢰성과 가치를 높임.
    • 다른 사이트에서 내 사이트로 연결되는 백링크(backlink)는 SEO에 매우 중요한 요소.
  7. 검색 엔진 크롤러 친화성
    • 검색 엔진이 사이트를 쉽게 크롤링하고 색인할 수 있도록 구조화.
    • robots.txt, sitemap.xml 등을 활용.
  8. 구조화된 데이터
    • 검색 엔진이 웹사이트 내용을 더 잘 이해할 수 있도록 Schema.org 같은 구조화된 데이터를 추가.

CSR(리액트)과 SEO의 관계

  • CSR(Client-Side Rendering)은 브라우저에서 JavaScript로 DOM을 생성하기 때문에 초기 HTML이 비어 있거나 최소한의 구조만 포함.
  • 검색 엔진 크롤러는 JavaScript를 실행하지 못하거나, 실행 후 렌더링된 콘텐츠를 수집하는 데 제한이 있을 수 있음.
  • 이로 인해 CSR 방식은 SEO에 불리한 경우가 많음.

해결 방법

  • SSR(Server-Side Rendering) 또는 Hydration을 통해 초기 HTML을 완성된 상태로 전달하면 SEO 문제가 해결 가능.
  • Next.js, Nuxt.js 같은 프레임워크는 React나 Vue 기반 프로젝트에 SSR을 적용해 SEO를 강화함.

결론

SEO는 검색 엔진에서 더 높은 가시성과 방문자를 얻기 위해 필수적인 전략입니다. CSR 방식은 SEO에 약점이 있을 수 있으나, SSR이나 하이브리드 방식으로 이를 보완할 수 있습니다. 😊


화면 업데이트 : JS가 DOM을 수정하면 발생

 

돔 수정 횟수를 최소화해야 효율적인 렌더링 가능

가상 돔을 이용한 효율적인 렌더링

직접 돔 수정 vs 간접 돔 수정

더보기
방법 직접수정 간접수정
메서드 createElement, appendChild, removeChild, 
setAttribute, innerHTML
useState, setState, useEffect, context
방식 DOM을 직접 수정 React 상태를 변경하여 가상 DOM을 업데이트한 후 실제 DOM에 반영
장점 세부적인 DOM 조작 가능 리플로우와 리페인팅을 최소화하고 효율적으로 UI 갱신
단점 성능 저하, React 방식과 충돌 가능 복잡한 상태 관리 필요

 

상태변경을 통해 화면 렌더링하는 과정

  1. 상태 변경 (useState, setState): 상태를 변경하면 React는 해당 컴포넌트를 다시 렌더링하도록 트리거합니다.
  2. 가상 DOM 업데이트: 상태가 변경되면 React는 가상 DOM을 새 상태를 기반으로 업데이트합니다. 가상 DOM은 실제 DOM의 메모리 상 복사본입니다.
  3. 비교 및 차이점 계산: 새 가상 DOM과 기존 가상 DOM을 비교하여 변경된 부분을 찾습니다. 이 과정을 diffing이라고 합니다.
  4. 최소화된 업데이트: 변경된 부분만 실제 DOM에 반영하여 성능을 최적화합니다. 이 과정을 reconciliation이라고 합니다.

 


타임리프와의 비교

더보기

Thymeleaf React를 비교하면, 두 도구는 UI를 생성하는 데 사용되지만, 동작 방식과 용도가 매우 다릅니다. 각각의 특징과 차이를 살펴보겠습니다.


Thymeleaf

1. 주요 특징

  • 서버 사이드 렌더링 (SSR):
    • Thymeleaf는 Java 기반 서버 측 템플릿 엔진으로, 서버에서 HTML을 동적으로 생성하여 클라이언트로 전달합니다.
    • 주로 Spring Framework와 함께 사용됩니다.
  • HTML 템플릿:
    • HTML 파일에 특별한 Thymeleaf 속성(e.g., th:text, th:if, th:each)을 추가해 데이터를 동적으로 삽입합니다.
    • 서버에서 데이터를 바인딩한 상태로 완성된 HTML을 반환합니다.
  • 전통적인 MVC 패턴:
    • 모델(Model)에 담긴 데이터를 뷰(View)로 전달하고, 뷰는 클라이언트에게 완성된 HTML을 제공합니다.

React

1. 주요 특징

  • 클라이언트 사이드 렌더링 (CSR):
    • React는 브라우저에서 동적으로 UI를 생성하며, 상태(state)와 속성(props)의 변화에 따라 화면을 업데이트합니다.
  • JSX를 활용한 컴포넌트 기반:
    • HTML과 JavaScript를 결합한 JSX 문법으로 UI를 선언적으로 설계하며, 재사용 가능한 컴포넌트를 중심으로 개발합니다.
  • SPA(Single Page Application) 구현에 적합:
    • 페이지 전체를 새로고침하지 않고, 상태 변화에 따라 필요한 부분만 다시 렌더링합니다.
  • Virtual DOM을 사용한 성능 최적화:
    • React는 변경 사항을 효율적으로 비교하여 DOM 업데이트를 최소화합니다.

Thymeleaf vs React: 주요 비교

기준ThymeleafReact
렌더링 방식 서버 사이드 렌더링 (SSR) 클라이언트 사이드 렌더링 (CSR)
작동 환경 서버에서 HTML을 완성 후 클라이언트로 전달 클라이언트에서 UI를 동적으로 생성 및 업데이트
사용 목적 정적인 페이지나 서버 중심 애플리케이션 구현 동적인 사용자 인터페이스와 SPA 구현에 적합
상태 관리 상태 관리 기능 없음 (Java 백엔드에서 처리) React 상태 관리 (state, props) 및 외부 라이브러리 지원
템플릿 언어 HTML + Thymeleaf 속성 (th:text, th:if 등) JSX(JavaScript + XML)
의존성 Spring Framework와 함께 사용 독립적으로 사용되며, 백엔드와 무관
초기 로딩 속도 빠름 (완성된 HTML 제공) 초기 로딩 속도 느릴 수 있음 (JS 번들 다운로드 필요)
동적 인터페이스 동적 UI 구현이 복잡함 (JavaScript를 추가로 작성해야 함) 동적 UI 구현이 용이 (React의 상태 관리로 간단히 처리)
SEO SEO에 유리 (SSR이기 때문) SEO에 불리하나, Next.js 같은 SSR 프레임워크로 보완 가능

Thymeleaf가 더 적합한 경우

  • 서버 중심의 렌더링이 필요한 경우 (e.g., SEO가 중요한 정적 페이지).
  • 간단한 데이터 바인딩과 서버에서 완성된 HTML 제공이 요구되는 경우.
  • Spring 기반의 기존 프로젝트에서 빠르게 템플릿 엔진을 도입하고자 할 때.

React가 더 적합한 경우

  • 인터랙티브한 사용자 경험(동적 UI)이 중요한 경우.
  • SPA(Single Page Application) 구현이 필요할 때.
  • 클라이언트 중심의 빠른 업데이트 및 상태 관리가 필수인 프로젝트.

 

728x90
반응형

'JavaScript > React.js' 카테고리의 다른 글

2. React App  (0) 2025.01.13
리액트 공부하기  (0) 2025.01.13