리액트 서버 컴포넌트에 배팅하기 코드 블럭, 수형도 등 다양한 콘텐츠를 보여줘야 함 → 많은 라이브러리 사용으로 번들 사이즈 증가 GraphQL로 콘텐츠를 쿼리해 가져와야 함 → 쿼리 리밋을 고려해 여러 번 API 호출해 조합해야 함 → BFF를 만들어서 편하게 데이터를 받을 수 있게 해야하나?
접혀진 아코디언은 검색할 수 없나요? 검색에서 일치하는 항목이 영역 내에 있을 때 이벤트 발생 상대적으로 최근에 추가된 HTML 스펙 (Chrome 102부터 가능) content-visibility: hidden 스타일 기본 적용됨 → 요소는 숨겨져 있지만 렌더링 상태는 유지 → display: none + visibility: hidden
렌더링 단계를 나눠 문제 탐색하기 JSX React ReactDOM DOM 1 리액트 컴포넌트로 변환 2 렌더링 대상 연산 3 실제 DOM에 반영 4 인터랙션 활성화 CODE LEVEL BROWSER LEVEL React 4 인터랙션 활성화 3 실제 DOM에 반영 DOM React 3 실제 DOM에 반영 4 인터랙션 활성화
const [isAnimating, setIsAnimating] = useState(false); content-visibility: hidden 스타일을 애니메이션 실행 중에는 제거해야함 setIsAnimating(true); animate( ref.current, nextIsOpened ? variants.show : variants.hide, { onComplete() { setIsAnimating(false); }, }, ); 애니메이션 실행 전/후로 상태 변경 const hiddenProp = isAnimating | | isOpen ? undefined : 'until-found'; /> 애니메이션 실행 중이거나 열려있을 때 hidden 속성을 비우도록 처리
두 번째 문제: 가이드를 이전하며 생긴 일 CMS 보일러플레이트들은 Static Site Generation 사용 → 콘텐츠 변경이 자주 있지 않음 → 초기 로딩 속도, SEO 관련 지표 향상 등이 주 목적 수정이 잦아지면 변경 페이지만 재생성하자 (Revalidate) → ISR (Incremental Static Regeneration)
다른 관점으로 렌더링 바라보기 네트워크 중심 · 태그/그룹핑 화면을 구성하는데 필요한 요청들이 있나? 네트워크 중심 · 캐싱 모든 네트워크 요청을 항상 새로 받아와야할까? 네트워크 중심 · 스트리밍 요청이 오래 걸리니 점진적으로 보여주게 할까? 페이지 중심 · SSG 처음부터 정적 생성해서 제공할까? 페이지 중심 · SSR 요청 받으면 서버에서 렌더링해서 내려줄까? 페이지 중심 · ISR 정적 생성하되 업데이트되는 곳만 재생성할까?
추가로 궁금할 수 있는 내용 모든 페이지에 한 번은 접속해야 캐시가 돌지 않나요? → 유저 가이드는 사이트맵이 있는 서비스 → 웹 크롤러는 사이트맵에 정의된 모든 페이지에 1회 이상 방문 → 웹 크롤러에 의해 데이터 캐시가 활성화될 것이다 → Search Console 등록 후 Web Vitals만 관리...?
사실 그외에도... 밟았던 / 밟고 있는 수많은 Next.js 버그들 가이드를 출력해 사용하는 분들을 위한 프린트 모드 → window.matchMedia('@media print') vs beforeprint() Shared Component가 일으킬 수 있는 빌드 오버헤드 JSON + LD로 구조화된 검색 데이터 생성하는 방법
아코디언 문제를 통해 프레임워크 / 라이브러리가 기능, 접근성 구현을 제한할 수 있음 구현할 것인가? 한다면 어떻게, 어디까지 할 것인가? 문제에 관여하는 주체와 동작, 영향을 나누어 파악하기 → 렌더링 단계를 나누어 ReactDOM이 관여함을 확인 → HTML이 대소문자 안가리는 특성을 활용해 우회
정적 페이지 생성이 느려진 문제를 통해 단순한 것도 스케일이 커지면 복잡도 역시 늘어난다 스케일이 커졌을 때에도 기존의 방법론이 여전히 유효한가? 렌더링 관점을 페이지 단위 → 네트워크 요청 단위로 바라보기 → 우리는 SSG가 아니라 Static Rendering이 필요했음