기술 특징
- 컴포넌트 기반 UI 렌더링 (독립적인 컴포넌트로 구조화(모듈화) 가능)
- 화면 업데이트 구현이 비교적 쉬움 (상태, 속성의 변경 감지시 재렌더링)
- 선언형 프로그래밍 : 과정은 생략하고 목적만 간결히 명시하는 방법
- 명령형 프로그래밍 : 절차 중심적으로, 프로세스를 상세히 정의하는 방법
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: 서버사이드 렌더링)
- 요청 처리
- 클라이언트가 서버에 페이지 요청을 보냅니다.
예: 사용자가 /products 경로를 요청.
- 클라이언트가 서버에 페이지 요청을 보냅니다.
- HTML 템플릿 생성
- 서버(Spring Boot)가 타임리프 템플릿과 데이터를 조합해 완성된 HTML 파일을 생성합니다.
- 이 과정에서 th:text, th:each 같은 속성을 사용하여 데이터를 HTML에 삽입합니다.
- 완성된 HTML 전달
- 서버는 완성된 HTML을 클라이언트(브라우저)에 전달합니다.
- 이때 브라우저는 추가적인 데이터 요청 없이 렌더링을 시작합니다.
- 브라우저 렌더링
- 브라우저가 HTML을 파싱하여 DOM을 생성하고, CSS를 파싱하여 CSSOM을 생성합니다.
- DOM과 CSSOM을 결합해 Render Tree를 만들고, Layout 및 Painting 단계를 거쳐 화면에 출력합니다.
리액트 (CSR: 클라이언트사이드 렌더링)
- 초기 HTML 전달
- 서버는 초기 HTML 파일을 전달하지만, 이 HTML은 비어 있거나 최소한의 <div id="root"></div> 구조만 포함합니다.
- 브라우저가 HTML을 파싱하고 DOM을 생성하지만, 초기 단계에서는 렌더링할 콘텐츠가 거의 없습니다.
- JavaScript 로드 및 실행
- 브라우저가 HTML에 포함된 JavaScript 파일(리액트 번들)을 다운로드하여 실행합니다.
- React 라이브러리는 초기 JavaScript 파일 실행 후 Virtual DOM을 생성하고, 이를 기반으로 화면 구성을 시작합니다.
- 동적 DOM 생성
- React는 상태(state)와 속성(props)에 따라 Virtual DOM을 기반으로 실제 DOM을 동적으로 생성합니다.
- 변경 사항이 발생하면 Virtual DOM을 비교(diffing)하여 필요한 부분만 실제 DOM에 업데이트합니다.
- 브라우저 렌더링
- 브라우저는 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 전달
- 서버에서 완성된 DOM이 브라우저로 전달.
- 브라우저가 DOM과 CSSOM을 생성하여 Render Tree를 만들고 화면에 출력.
- 상태 변경 시 브라우저가 새로운 HTML 요청 → 기존 DOM을 완전히 대체.
리액트: 브라우저에서 DOM 생성
- 브라우저가 서버에서 받은 HTML을 기반으로 React 앱 초기화.
- React가 Virtual DOM을 생성하고, 브라우저가 이를 기반으로 실제 DOM을 동적으로 생성.
- 상태 변경 시 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의 주요 요소
- 콘텐츠 품질 및 키워드
- 사용자가 검색할 가능성이 높은 키워드를 포함한 고품질 콘텐츠를 작성.
- 콘텐츠가 명확하고 유용해야 함.
- 메타 태그 최적화
- Title 태그와 메타 설명(Meta Description)을 적절히 작성해 검색 결과에 매력적으로 표시.
- 예: <meta name="description" content="...">
- URL 구조 최적화
- URL이 간결하고 키워드를 포함하도록 설계.
- 예: example.com/blog/react-seo-tips
- 모바일 최적화
- 웹사이트가 모바일 친화적이어야 함. (반응형 디자인, 빠른 로드 속도 등)
- 사이트 속도
- 웹사이트의 로드 속도가 빠를수록 SEO 점수가 높아짐. (검색 엔진은 느린 사이트를 선호하지 않음)
- 링크 전략
- 내부 링크와 외부 링크를 적절히 배치하여 웹사이트의 신뢰성과 가치를 높임.
- 다른 사이트에서 내 사이트로 연결되는 백링크(backlink)는 SEO에 매우 중요한 요소.
- 검색 엔진 크롤러 친화성
- 검색 엔진이 사이트를 쉽게 크롤링하고 색인할 수 있도록 구조화.
- robots.txt, sitemap.xml 등을 활용.
- 구조화된 데이터
- 검색 엔진이 웹사이트 내용을 더 잘 이해할 수 있도록 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이나 하이브리드 방식으로 이를 보완할 수 있습니다. 😊
돔 수정 횟수를 최소화해야 효율적인 렌더링 가능
직접 돔 수정 vs 간접 돔 수정
방법 | 직접수정 | 간접수정 |
메서드 | createElement, appendChild, removeChild, setAttribute, innerHTML |
useState, setState, useEffect, context |
방식 | DOM을 직접 수정 | React 상태를 변경하여 가상 DOM을 업데이트한 후 실제 DOM에 반영 |
장점 | 세부적인 DOM 조작 가능 | 리플로우와 리페인팅을 최소화하고 효율적으로 UI 갱신 |
단점 | 성능 저하, React 방식과 충돌 가능 | 복잡한 상태 관리 필요 |
상태변경을 통해 화면 렌더링하는 과정
- 상태 변경 (useState, setState): 상태를 변경하면 React는 해당 컴포넌트를 다시 렌더링하도록 트리거합니다.
- 가상 DOM 업데이트: 상태가 변경되면 React는 가상 DOM을 새 상태를 기반으로 업데이트합니다. 가상 DOM은 실제 DOM의 메모리 상 복사본입니다.
- 비교 및 차이점 계산: 새 가상 DOM과 기존 가상 DOM을 비교하여 변경된 부분을 찾습니다. 이 과정을 diffing이라고 합니다.
- 최소화된 업데이트: 변경된 부분만 실제 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) 구현이 필요할 때.
- 클라이언트 중심의 빠른 업데이트 및 상태 관리가 필수인 프로젝트.
'JavaScript > React.js' 카테고리의 다른 글
2. React App (0) | 2025.01.13 |
---|---|
리액트 공부하기 (0) | 2025.01.13 |