
이번 수업을 통해 최신 웹 기술과 도구에 대해 이해를 할 수 있었고, 특히 리액트 관련 성능 최적화 방법에 대해 깊이 있게 배웠다. 내일부터 본격적으로 배우게 될 Tailwind와 리액트가 기대된다.
Node.js의 기본 패키지 관리자
📍패키지(package): 소프트웨어 개발에서 재사용할 수 있도록 묶어놓은 코드의 집합, 특정 기능이나 기능 세트를 구현한 라이브러리, 프레임워크, 도구 등을 포함할 수 있음
.npmrc 파일을 통해 설정 가능package-lock.json 파일을 사용하여 패키지 버전을 고정Node 패키지를 실행하는 도구
📍개발 의존성(Development Dependency): 개발 과정에서 필요한 도구와 라이브러리로, 애플리케이션의 실제 배포 및 실행에는 필요하지 않음, 개발 의존성을 줄이는 것은 프로젝트의 복잡성을 줄이고, 빌드 및 배포 과정을 최적화하며, 보안을 강화하고, 유지보수 비용을 절감하는 데 중요한 역할을 함
페이스북에서 개발한 패키지 매니저
최신 패키지 매니저 중 Bun과 PNPM이라는 것도 있음

출처: NPM vs Yarn vs PNPM: Which Package Manager is Right for You?
package-lock.json파일은 npm install 시 자동으로 생성 되므로 .gitignore파일에 추가 하자npm install: package.json 파일을 참고해서 node_modules, package-lock.json을 자동으로 생성함가장 고전적인 방법, 더이상 권장되지 않음
npx create-react-app my-app -> (npm 레지스트리의 최신 버전 실행)
npm install -g creact-react-app -> (npm 레지스트리의 최신 버전 설치)
create-react-app my-app -> (설치 당시의 버전 실행)
create-react-app 버전이 시간이 지남에 따라 최신 상태가 아닐 수 있으므로 수동 업데이트하지 않는 한 새로운 버그 수정이나 기능 업데이트를 놓칠 수 있음근래에 가장 주목 받고 있는 프로젝트 생성 방법
npm create vite@latest
npm create 명령어는 내부적으로 npx 패키지를 활용하여 프로젝트를 생성해주기 때문에 항상 최신의 버전의 패키지를 사용함
node_modules/:
npm install 명령어 통해 package.json 파일에 명시된 모든 의존성을 이 폴더에 설치함public/:
src/:
assets/: 이미지, 폰트 등의 정적 자산을 포함할 수 있는 폴더, public/과 달리 웹팩의 영향을 받음App.jsx: 메인 애플리케이션 컴포넌트 파일, React 컴포넌트 구조의 시작점main.jsx: 애플리케이션의 진입점 파일, ReactDOM을 사용하여 App 컴포넌트를 HTML에 렌더링함index.html:
public/ 또는 최상위 디렉토리에 있는 HTML파일package.json
vite.config.ts
리액트를 가장 인기있는 프레임워크로 만들어 준 핵심 기능
React는 SPA 구조에서 빈번한 DOM 조작으로 인한 성능 문제를 해결하기 위해 가상 돔을 사용함
웹 페이지가 사용자에게 표시되기까지의 과정. CRP는 페이지 로드 성능에 중요한 영향을 미침

HTML 파싱 및 DOM 생성: 브라우저는 HTML 문서를 파싱하여 DOM(Document Object Model)을 생성함
CSS 파싱 및 CSSOM 생성: CSS 스타일시트를 파싱하여 CSSOM(CSS Object Model)을 생성함
JavaScript 실행: JavaScript는 DOM이나 CSSOM을 수정할 수 있으며, 이를 통해 렌더링에 영향을 줄 수 있음
렌더 트리 생성: DOM과 CSSOM을 결합하여 렌더 트리를 생성, 이 트리는 실제로 렌더링할 요소만 포함함
레이아웃: 렌더 트리를 기반으로 각 요소의 크기와 위치를 계산함
페인팅: 최종적으로 계산된 정보를 사용하여 화면에 픽셀을 그림
Reflow와 Repaint: 페이지 이동이나 JavaScript 조작으로 CRP가 다시 발생하며, Reflow와 Repaint는 성능 비용이 큼. 따라서 이를 최적화하는 것이 중요함
<li> 요소를 추가할 때마다 Reflow와 Repaint가 1000번 발생함 -> 성능 저하<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script>
function createDOM() {
console.time();
const ulEl = document.querySelector('ul');
for (let i = 0; i < 1000; i++) {
ulEl.innerHTML += `<li>${i}</li>`;
}
console.timeEnd();
}
</script>
</head>
<body>
<button onClick="createDOM()">추가</button>
<ul></ul>
</body>
</html>
<li> 요소를 한 번에 추가하여 Reflow와 Repaint를 한 번으로 줄임<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script>
function createDOM() {
console.time();
const ulEl = document.querySelector('ul');
let liEl = '';
for (let i = 0; i < 1000; i++) {
liEl += `<li>${i}</li>`;
}
ulEl.innerHTML = liEl;
console.timeEnd();
}
</script>
</head>
<body>
<button onClick="createDOM()">추가</button>
<ul></ul>
</body>
</html>
JavaScript만으로 최적화하는 과정은 복잡하고 어렵기 때문에 React와 같은 프레임워크가 등장함
프레임워크는 이런 최적화를 자동으로 처리할 수 있으며, React는 Virtual DOM을 사용하여 효율적으로 DOM을 조작함

출처: What is Diffing Algorithm ? - GeeksforGeeks
Batch Update는 무엇인가?
Virtual DOM도 성능 비용이 있으며 React는 내부적으로 이러한 성능을 최적화하지만, 모든 경우에 완벽한 최적화를 보장하지는 않음
createElement 함수를 사용해서 모든 React 컴포넌트와 엘리먼트 생성 가능createElement를 사용해 모든 요소를 수동으로 작성함import React from 'react';
import ReactDOM from 'react-dom';
// React.createElement를 사용하여 컴포넌트 정의
const element = React.createElement(
'div', // 태그 이름
{ className: 'greeting' }, // 속성
'Hello, world!' // 자식 요소(내용)
);
// 해당 컴포넌트를 DOM에 렌더링
ReactDOM.render(
element,
document.getElementById('root')
);
createElement를 사용하는 방식은 번거롭고 가독성이 떨어짐
페이스북 팀은 개발자들이 더 익숙한 HTML과 유사한 문법을 사용해 React 컴포넌트를 작성할 수 있는 JSX를 도입
JSX는 개발 편의성을 크게 높였고, React의 채택을 가속화하는 데 중요한 역할을 함
JSX는 브라우저에서 직접 실행할 수 없는 문법이기 때문에, Babel과 같은 트랜스파일러가 필요함
React.createElement 호출로 변환하므로 JSX와 React.createElement는 서로 상호 보완적인 관계에 있음react-scripts 패키지(스크립트 모음으로, 프로젝트를 설정하고 관리하는 데 필요한 웹팩, 바벨과 같은 스크립트가 포함되어 있음)@vitejs/plugin-react(-swc) (웹 팩과 바벨의 역할을 하는 패키지)주요 문법 특징
<React.Fragment> 또는 <></>를 사용할 수 있음{}를 사용하여 JavaScript 표현식을 포함할 수 있음 예를 들어, <h1>Count: {10 * 2}</h1>와 같이 작성할 수 있음리액트에서 컴포넌트에 CSS 스타일을 적용하는 방법에는 여러 가지가 있음
컴포넌트의 JSX 내에서 style 속성을 통해 직접 스타일을 지정하는 방법
const App = () => {
return (
<div>
<h1 style={{ fontSize: "30px", color: "#ed4848", textDecoration: "line-through" }}>
Hello World!
</h1>
</div>
);
};
export default App;
별도의 CSS 파일에 CSS 코드를 작성하고, 리액트 컴포넌트 파일과 연결해서 사용하는 방법
main.tsx와 같은 파일에 import함각 클래스 이름을 로컬 범위로 한정시켜 스타일 충돌을 방지하는 방법
.module.css 확장자를 사용하며, 컴포넌트에서 import하여 사용함대표적인 Atomic CSS 라이브러리, 클래스 이름만으로 스타일을 적용할 수 있음
CSS-in-JS는 자바스크립트 파일 내에서 스타일을 정의하고, 컴포넌트와 밀접하게 결합하여 사용하는 방법
리액트에서 말하는 서버는 뭘까?
런타임 오버헤드란?
dependency vs devDependency
——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : Next.js 2기 과정(B-log) 리뷰로 작성 되었습니다.