일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바의정석
- 정보처리기사
- 코딩테스트
- 평일코딩
- 정보처리기사요약
- 이안의평일코딩
- Oracle
- 리액트네이티브
- 자바스크립트
- 정보처리기사실기정리
- 리액트
- 정보처리기사실기
- 국비코딩
- 타입스크립트
- CSS
- 국비IT
- spring
- 자스코테
- php
- 스프링
- javascript
- react
- typescript
- ReactNative
- 정보처리기사정리
- 자바스크립트 코딩테스트
- Java의정석
- 정보처리기사실기요약
- VUE
- 오라클
- Today
- Total
이안의 평일코딩
리액트 18: 무엇이 달라졌나? 요약 및 간략 후기 본문
React v18 후기
2022년 3월 출시된 리액트 18의 기존 버전과의 가장 큰 차이점은 바로 동시성(Councurrency) 지원이다.
동시에 여러 작업을 효율적으로 처리하여 앱의 응답성을 개선한 점이 눈여겨볼만 하다.
코드를 크게 바꾸지 않고도 성능 개선을 느낄 수 있고 필요하면 점진적으로 적용할 수 있어 업데이트 부담도 적었다.
Automatic Batching
Batching은 업데이트 대상이 되는 상태값들을 하나의 그룹으로 묶어 한번의 리렌더링에 업데이트가 모두 진행될 수 있게 해주는 것이다.
한 함수 안에서 setState를 아무리 많이 호출시키더라도 리렌더링은 단 한번만 발생하고 여러번 리렌더링 하는것을 막아 성능이 향상된다.
// React 17에서는 각각 렌더링 됨
setTimeout(() => {
setCount(count => count + 1);
setFlag(flag => !flag);
}, 1000);
// React 18에서는 한 번에 렌더링됨
batch 처리하기 싫은 경우의 경우에는 ReactDOM.flushSync()를 사용하여 동기적으로 즉시 렌더링시킬 수 있다.
예를 들어, UI가 지금 당장 반영돼야 하는 중요 이벤트 처리나 애니메이션 프레임 맞출 때 등등 사용할 수 있다.
useTransition, startTransition
중요하지 않은 업데이트(예: 검색어 입력 시 필터링)를 부드럽게 처리할 수 있다.
특정 업데이트를 Transition으로 표시하여 사용자 상호 작용을 크게 개선했다.
상태 전환 중에 시각적 피드백을 제공하고 전환이 발생하는 동안 브라우저의 응답성을 유지하고,
어떠한 업데이트가 우선순위가 높은지 알려줄 수 있다.
예를 들어, 검색창과 결과창 두 부분으로 나눠 유저가 타이핑하는 것에 따라 즉각 반영되기를 기대하는 검색창과
검색창보다는 UI 업데이트가 느린 것에 자연스럽게 받아들여질 수 있는 결과창으로 나누면
검색창은 Urgent Update, 결과창은 Transition Update로 나눌 수 있다.
const [isPending, startTransition] = useTransition();
const handleChange = (e) => {
startTransition(() => {
setInputValue(e.target.value);
});
};
위 코드에서 isPending을 이용해 로딩 스피너를 띄우거나 하면 편하게 UI를 구현할 수 있다.
Suspense
React 16.6 때 나온 초기 버전은 코드스플리팅 (lazy-loading)을 위해 사용했었는데,
이때 Suspense는 컴포넌트 단위에서만 쓸 수 있었고 데이터 페칭에는 쓰지 못했다.
const Profile = React.lazy(() => import('./Profile'));
<Suspense fallback={<div>Loading...</div>}>
<Profile />
</Suspense>
React 18에서 확장된 Suspense는 데이터 페칭도 다룰 수 있게 됐고 서버 사이드 렌더링에서도 지원하며
React Query, SWR 등의 라이브러리에서도 Suspense를 지원하기 시작했다.
<Suspense fallback={<Loading />}>
<UserProfile />
</Suspense>
UserProfile 컴포넌트 내부에서 데이터를 비동기로 불러오고 있다면 데이터가 준비될 때까지 fallback UI를 보여준다.
useId
SSR(서버 사이드 렌더링)에서도 고유 ID를 안정적으로 생성할 수 있고 접근성(ARIA) 작업할 때 필수다.
const id = useId();
return <input id={id} />;
useDefferedValue
값 자체를 지연시켜 부드러운 렌더링을 유도할 수 있다.
const deferredValue = useDeferredValue(value);
복잡한 리스트를 필터링할 때 깜빡임이나 멈춤 현상을 줄이거나하여 단순하지만 꽤 큰 체감 개선이 가능하다.
기타 변경사항
ReactDOM.render는 Deprecated되어 ReactDOM.createRoot를 사용해야 한다.
'Front-end > React' 카테고리의 다른 글
리액트 19: 새로운 프론트엔드 시대를 여는 기능 정리 (1) | 2025.05.15 |
---|---|
[SOLID] React에 개방폐쇄원칙 적용하기 (0) | 2024.02.11 |
[SOLID] React에 단일책임원칙 적용하기 (0) | 2024.02.11 |
[React] 글자 수 이상일 때 '...' 처리하기 (0) | 2022.08.03 |
[React] 리액트 Hooks 총 정리 (0) | 2022.07.31 |