DOM (문서 개체 모델)
Dom
React Dom
SPA (단일 페이지 애플리케이션)
완전히 새로운 페이지를 로드
서버의 새로운 데이터로 현재 웹 페이지를 동적으로 다시 작성
사용자와 상호작용하는 웹 애플리케이션
효율적인 업데이트 및 렌더링 시스템으로 인해 SPA 구축에 매우 적합
즉, 처음 페이지가 로드된 후에는 사용자와 상호 작용하여
새 페이지가 아닌 현 페이지 내 요소를 동적으로 다시 작성
State & Props
State
Props
리액트 훅
useState
useEffect
useMemo
useCallback
useRef
useContext
CSR & SSR
CSR (클라이언트 측 렌더링)
SSR (서버 측 렌더링)
SSG (정적 사이트 생성)
상태 관리 라이브러리
React-Query
stale-time
cache-time
import { useQuery } from '@tanstack/react-query';
const fetchProjects = async () => {
const response = await fetch('/api/projects');
return response.json();
};
const Projects = () => {
const { data, isLoading } = useQuery(['projects'], fetchProjects, {
staleTime: 1000 * 60 * 5, // 5 minutes
cacheTime: 1000 * 60 * 60 // 1 hour
});
if (isLoading) return <div>Loading...</div>;
return <div>{JSON.stringify(data)}</div>;
};
Redux
Recoil
비동기 & 동기 활용한 ES 기술
Promises
async-await
import React, { useState, useEffect } from 'react';
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
};
const MyComponent = () => {
const [data, setData] = useState(null);
useEffect(() => {
fetchData().then(setData).catch(console.error);
}, []);
return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>;
};
export default MyComponent;
React 컴포넌트 디자인의 세 가지 핵심 요소
재사용성
상태 관리
성능
TypeScript 사용
사용 이유
제네릭
function identity<T> (arg: T): T {
return arg;
}
interface User {
name: string;
age: number;
}
Webpack & Babel
Webpack
Babel
Redux
Dispatch
Action
Store
View
Webpack4 / Webpack45 빌드과정 & 번들링 최적화
Webpack4
Webpack5
Webpack 5는 특히 빌드 시간 및 번들 효율성 측면에서 Webpack 4에 비해 크게 개선
Unit & E2E & Integration Test
Unit Test
// > 두 숫자의 합을 올바르게 계산하는지 확인 <
// add.js
function add(a, b) {
return a + b;
}
module.exports = add;
// add.test.js
const add = require('./add');
test('adds 1 + 2 to equal 3', () => {
expect(add(1, 2)).toBe(3);
});
Integration Test
// > 엔드포인트에 HTTP 요청을 하고 응답이 예상대로 수행되는지 확인 <
// app.js
const express = require('express');
const app = express();
app.get('/sum', (req, res) => {
const { a, b } = req.query;
res.json({ sum: parseInt(a) + parseInt(b) });
});
module.exports = app;
// app.test.js
const request = require('supertest');
const app = require('./app');
test('GET /sum adds two numbers', async () => {
const response = await request(app).get('/sum?a=1&b=2');
expect(response.statusCode).toBe(200);
expect(response.body.sum).toBe(3);
});
E2E Test
// > 웹 응용 프로그램에서 로그인 프로세스를 테스트하는 것 <
// E2E test with Cypress
describe('Login Test', () => {
it('successfully logs in', () => {
cy.visit('/login'); // Visit the login page
cy.get('input[name=username]').type('user123'); // Enter username
cy.get('input[name=password]').type('password123'); // Enter password
cy.get('button[type=submit]').click(); // Click the login button
cy.url().should('include', '/dashboard'); // Ensure the user is redirected to the dashboard
});
});
결론
Debounce & Throttle & rAF
Debounce
function debounce(func, delay) {
let inDebounce;
return function() {
const context = this;
const args = arguments;
clearTimeout(inDebounce);
inDebounce = setTimeout(() => func.apply(context, args), delay);
};
}
// Usage
window.addEventListener('resize', debounce(() => {
console.log('Resize event handler called');
}, 250));
Throttle
function throttle(func, limit) {
let inThrottle;
return function() {
const args = arguments;
const context = this;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(() => (inThrottle = false), limit);
}
};
}
// Usage
window.addEventListener('scroll', throttle(() => {
console.log('Scroll event handler called');
}, 1000));
requestAnimationFrame
let lastScrollY = 0;
function onScroll() {
lastScrollY = window.scrollY;
requestAnimationFrame(update);
}
function update() {
console.log('Scroll position:', lastScrollY);
// Perform updates based on scroll position
}
window.addEventListener('scroll', onScroll);
Debounce 및 throttle은 모두 이벤트 처리기가 호출되는 속도를 제어하는 데 효과적
특히 스크롤 이벤트에 연결된 경우 부드러운 애니메이션 및 업데이트에 이상적
Chakra UI 사용
적절한 경우 React.memo, useMemo, useCallback과 같은
성능 최적화 기술을 사용
자신만의 색상, 글꼴 및 기타 스타일 속성을 정의하기 위해
사용자 정의할 수 있는 테마 개체를 제공
React 와 Next 차이
Next.js 에서 API는?
pages/api
디렉토리에 작성