#React
서버 사이드 렌더링이란 무엇인가
서버 사이드 렌더링(SSR)이 무엇인지 개념부터 정리합니다. HTML을 서버에서 생성하는 방식과, 클라이언트 사이드 렌더링(CSR)과의 차이를 설명합니다.
JSX가 무엇인지 정리하기
JSX가 무엇인지 개념부터 정리합니다. HTML처럼 보이지만 JavaScript 문법 확장이라는 점과, 빌드 과정에서 함수 호출로 변환되는 구조를 중심으로 설명합니다.
메모이제이션이란 무엇인가
메모이제이션이 무엇인지 개념부터 정리합니다. 계산 최적화 기법으로서의 메모이제이션이 어떤 전제에서 성립하는지, 그리고 언제 의미를 가지는지를 중심으로 설명합니다
자주 사용하는 리액트 훅 (2)
React에서 구조와 렌더링 타이밍을 다루기 시작하면서 사용하게 된 훅들을 정리합니다. useLayoutEffect, useContext, 커스텀 훅이 어떤 상황에서 유용했는지를 중심으로 기록합니다.
자주 사용하는 리액트 훅 (1)
React에서 가장 자주 사용하는 훅인 useState, useEffect, useRef를 정리합니다. 각 훅이 무엇을 위한 도구인지와 어떤 상황에서 유용한지를 중심으로 설명합니다.
props drilling이 생겼던 구조와 당시 선택
React에서 상태를 상위로 끌어올리면서 발생한 props drilling 구조를 정리합니다. 중간 컴포넌트가 props를 전달만 하게 된 문제와, 그 시점에서 Context API를 선택지로 고려하게 된 이유를 기록합니다.
리액트에서 key를 사용하는 이유
React에서 리스트를 렌더링할 때 key가 왜 필수인지 정리합니다. React의 렌더링 방식과 index를 key로 사용할 때 발생하는 문제를 중심으로, 안정적인 key를 선택하는 기준을 기록합니다.
useState로 상태를 관리하다가 불편해지기 시작한 지점
React에서 useState로 상태를 관리하던 중, 페이지 이동·새로고침·뒤로가기 상황에서 상태가 유지되지 않았던 문제를 정리합니다.
React 19: Effect 내부에서 setState 호출 시 발생하는 경고(cascading render)와 해결 방법
React 19과 React Compiler 환경에서 프로젝트를 진행하면서 `useEffect` 내부에서 `setState`를 호출할 때 **cascading render 경고**가 발생했다. 이전 버전에서는 문제가 없던 코드이지만, React 19 Compiler는 초기 렌더 흐름을 더 엄격하게 검사한다. 해당 경고가 발생하는 원리와 해결 방법을 정리한다. ## 문제 코드 ```tsx const [isOpen, setIsOpen] = useState(false); useEffect(() => { if (typeof window !== "undefined") { const saved = localStorage.getItem("SidebarOpen"); if (saved !== null) { setIsOpen(saved === "true"); } } }, []); ``` ### 많은 사람들이 오해할 수 있는 부분 1. effect가 반복 실행돼서 발생하는 문제는 아니다 useEffect(() => {}, [])는 기본적으로 한 번만 실행된다. 문제는 effect 실행 횟수가 아니라 렌더 후 상태가 뒤늦게 변경되는 구조다. 2. localStorage 값에 따라 effect가 재실행되는 것은 아니다 localStorage의 내용은 effect 동작과 무관하다. 3. cascading render가 무한 루프를 의미하는 것은 아니다 React 19에서 말하는 “cascading render”는 초기 렌더 후 추가 렌더가 이어지는 비효율적인 초기화 과정을 의미한다. ### 왜 경고가 발생하는가 React Compiler는 초기 렌더 흐름이 다음과 같이 진행되는 경우를 비효율적이라고 판단한다. ```javascript 초기 render (isOpen = false) ↓ commit ↓ useEffect 실행 ↓ setIsOpen(...) ↓ re-render ``` 초기 렌더에서 실제 상태가 확정되지 않은 채 commit이 발생하기 때문에 Compiler는 이를 “초기 상태가 늦게 확정되는 패턴”으로 보고 경고를 띄운다. ### 해결 방법: 초기 상태를 렌더 전에 확정하기 localStorage에서 값을 읽는 로직을 useEffect가 아닌 useState의 lazy initializer로 옮기면 경고가 해결된다. ### 수정된 코드 ```javascript const [isOpen, setIsOpen] = useState(() => { if (typeof window !== "undefined") { const saved = localStorage.getItem("SidebarOpen"); return saved === "true"; } return false; }); ``` ### 정리 | 방식 | 렌더 횟수 | React Compiler 평가 | | ------------------------- | --------- | ------------------------ | | effect 안에서 setState | 최소 2번 | 비효율적, 경고 발생 가능 | | useState lazy initializer | 1번 | 가장 이상적인 패턴 |