-
[React] React란 무엇인가?React 2024. 1. 29. 18:06
React의 특징
- 애플리케이션의 UI(User Interface)를 생성하는데 집중한 라이브러리로, Javascript를 기반으로 함.
- JSX(JavaScript XML) 문법 사용.
- 가상 돔(Virtual DOM)을 사용하여 UI렌더링을 최적화.
- 단방향 데이터 바인딩의 특성.
- 선언형 프로그래밍
- 컴포넌트 기반의 UI관리.
그렇다면 지금부터 위에서 설명한 React의 특징을 하나씩 살펴보자.
JSX(JavaScript XML)
- HTML 요소에 유효한 자바스크립트 객체를 내장할 수 있는 자바스크립트 확장이다.
- Vanilla JS에서는 html과 script를 나누어서 작성했지만,
React환경에서는 자바스크립트에서 HTML을 작성할 수 있도록 해주는 것이 큰 장점
📌XML이란
eXtensibla Markup Language로, HTML과 같은 마크업 언어
HTML은 데이터를 표현하는 언어라면, XML은 데이터를 기술하는 언어<!DOCTYPE html> <html> <body> <span>몇 번 눌렀니? 0</span> <button id="btn">클릭</button> </body> <script> const button = document.getElementById('btn'); const span = document.querySelector('span'); let counter = 0; function handleClick() { console.log('클릭 됨'); counter = counter + 1; span.innerText = `몇 번 눌렀니? ${counter}`; } button.addEventListener('click', handleClick); </script> </html>
html로 작성한 페이지
import React, { useState } from 'react'; function App() { const [count, setCount] = useState(0); const handleClick = () => { setCount(count + 1); }; return ( <div> <span>몇 번 눌렸니? {count}</span> <button onClick={handleClick}>클릭</button> </div> ); } export default App;
JSX문법으로 작성한 페이지
가상 돔(Virtual DOM)
- 현재 대부분의 웹 사이트가 SPA(Single Page Application)방식을 채택하고 있음.
페이지 전체를 다시 로드하는 것이 아니라 필요한 부분만 Javascript코드에 의해 업데이트되므로 사용자 입장에서는 빠른 상호작용과 부드러운 페이지 전환이 가능해지는데, React에서는 Virtual DOM이 바로 이 역할을 수행. - 브라우저의 렌더링 과정을 잠깐 살펴본 적이 있었는데, React는 이 과정에서 리플로우와 리페인트가 자주 수행되는 문제를 해결하기 위해 Virtual DOM을 사용.
- 메모리 상에 사용자가 보고 있는 DOM과 동일한 가상의 DOM을 만들고, DOM 조작이 발생하면 가상 DOM에서 연산을 수행한 후 실제 DOM과 비교하여 UI을 업데이트하는 방식을 통해 리플로우와 리페인트 연산을 최소화.
단방향 데이터 바인딩
- React에서는 부모 컴포넌트 → 자식 컴포넌트 방향으로만 데이터 바인딩이 가능
- 디버깅 용이성 : 컴포넌트의 흐름이 예측 가능하기 때문에 디버깅이 쉬워짐
- 컴포넌트 독립성 : 자식 컴포넌트는 부모로부터 전달받은 props를 통해서 데이터에 접근 가능하지만, 수정은 불가능
→ 컴포넌트 간의 결합도를 낯추고 재사용성을 향상시킴
📌 데이터 바인딩이란
화면상에 보이는 데이터(View)와 브라우저의 메모리에 있는 데이터(Model)를 묶어서 동기화하는 것단방향 vs 양방향
- 단방향 데이터 바인딩
- React의 데이터 바인딩 방식
- Javascript(Model) → HTML(View)의 방향으로만 데이터를 동기화하는 것을 의미
- 부모 컴포넌트에서 하위 컴포넌트로만 데이터가 전달(Props를 통해)되는 구조
- HTML(View) → Javascript(Model)로의 직접적인 데이터 갱신은 불가능하므로
이벤트 함수(onClick, onChange 등)를 이용하여 Javascript를 통해 HTML을 변경해야함
import React, { useState } from 'react'; function App() { const [data, setData] = useState(''); // 데이터 바인딩 const bindData = (event) => { setData(event.target.value); }; return ( <div className="App"> <input type="text" value={data} onChange={bindData} /> <div>입력한 텍스트 : {data}</div> </div> ); } export default App;
리액트에서의 데이터 바인딩
- 양방향 데이터 바인딩
- Vue.js, Angular의 데이터 바인딩 방식
- Javscript(Model)와 HTML(View)사이에 ViewModel이 존재
둘 중 하나만 변경되어도 ViewModel이 동시에 동기화해줌 - 부모 컴포넌트에서 자식 컴포넌트로는 Props를 통해 데이터를 전달
자식 컴포넌트에서 부모 컴포넌트로는 Emit Event를 통해 데이터를 전달
<template> <div> <!-- v-model(ViewModel)이 양방향 데이터 바인딩을 수행 --> <input type="text" v-model="data"> <p>입력한 텍스트 : {{ data }}</p> </div> </template> <script> export default { data() { return { data: '' }; } }; </script>
Vue.js에서의 데이터 바인딩
선언형 프로그래밍
- React에서는 DOM API와 관련된 코드가 추상화되어있기 때문에,
개발자들은 html이 어떻게(How) 동작하는지보다, 무엇(What)을 작성해야 할지에 더 집중할 수 있다. - 관리해야할 변수가 줄어들어 유지보수 및 가독성이 좋고, 디버깅이 쉽다.
📌 명령형 프로그래밍 vs. 선언형 프로그래밍
명령형 프로그래밍은 어떻게(How) 나타내는지 관심
선언형 프로그래밍은 무엇(What)을 나타내는지에 관심?????솔직히 무슨 말인지 잘 모르겠다.예시를 통해 알아보자
- Vanilla Javascript와 React로 예시를 만들어 비교해보자.
<!DOCTYPE html> <html> <body> <ul id=”list”></ul> </body> <script> // Vanilla JS에서는 어떻게(How)에 집중해보자. var arr = [1, 2, 3, 4, 5] // 일단 html에서 ul태그를 선택하고.. var elem = document.querySelector("#list"); // arr을 순회하면서 for(var i = 0; i < arr.length; i ++) { // 리스트의 요소를 또 하나하나씩 만들고 var child = document.createElement("li"); // 요소의 값에 데이터를 할당하고 child.innerHTML = arr[i]; // 완성된 리스트 요소를 ul태그 내부에 집어넣는다 elem.appendChild(child); } </script> </html>
바닐라 자바스크립트로 작성한 코드
import React, { useState } from 'react'; // 리액트에서는 무엇(What)을 나타내는지에 집중해보자. function App() { const [arr, setArr] = useState([1, 2, 3, 4, 5]); // html상에서 목록이 이렇게 생겼고 // JSX문법은 html태그와 javscript문법을 동시에 쓸 수 있으니.. // ul태그 내부에 li태그를 map함수로 집어넣으면 되겠네? return ( <ul> {arr.map((index, elem) => ( <li key={index}>{elem}</li> ))} </ul> ); } export default App;
리액트로 작성한 코드
솔직히 이렇게 해보고 나서도 How와 What의 차이?를 모르겠다..
하지만 확실한 차이점은,
React에서는 html의 요소를 선택하거나 생성할 필요가 없다는 것컴포넌트 기반의 UI관리
- UI를 개발할 때, 컴포넌트라고 부르는 단위로 코드를 작성하여 관리함
- 컴포넌트는 재사용이 가능하며, 재사용을 통해 생산성과 유지보수성이 향상됨
const Header = () => { return <h1>헤더 입니다.</h1>; }; const Footer = () => { return <h2>푸터 입니다.</h2>; }; function App() { return ( <div> <Header /> <div>내용</div> <button>버튼</button> <Footer /> </div> ); } export default App;
'React' 카테고리의 다른 글
[React] Hooks (0) 2024.03.08 [React] React의 장단점 (0) 2024.01.31