pile·
프론트엔드·vercel-blogVercel Blog·

React Wrap Balancer: 이진 탐색으로 텍스트 줄 균형 맞추기

React Wrap Balancer는 웹 제목과 헤딩에서 불균형한 줄 나눔을 방지하는 1kB 미만의 경량 React 라이브러리다. 이진 탐색(binary search) 알고리즘으로 래퍼 너비를 "추가 줄 나눔이 생기기 직전의 최솟값"까지 줄여 텍스트를 균형 있게 배치하며, 4K 디스플레이(3840px)에서도 12번 반복이면 충분하다. 클라이언트 렌더링에선 useLayoutEffect로, SSR에선 인라인 스크립트로 레이아웃 시프트(CLS)를 방지한다.

핵심 포인트
  • 이진 탐색으로 래퍼 너비를 줄 나눔 직전까지 축소한다. 범위를 0~전체 너비로 잡고 반씩 줄여가며 정확한 줄 나눔 지점을 찾는다.
  • 4K 디스플레이(3840px)에서 최대 12번 반복으로 결정 — 이진 탐색의 O(log n) 덕에 화면 너비가 늘어도 반복 횟수는 로그 증가에 그친다.
  • 100개 이하 문자열 처리 시 약 0.25밀리초로 실행되어 렌더링 성능 영향이 없다.
  • CSR은 `useLayoutEffect`로 DOM 페인트 전 동기 실행, SSR은 타이틀 직후 인라인 스크립트로 즉시 실행해 CLS를 방지한다.
  • Next.js 13 App Directory, React Server Components, Streaming SSR에서 최적화 지원. Svelte 포트도 제공.
상세 정리
  • 문제 정의: 웹 제목/헤딩에서 한 줄이 훨씬 짧게 끊기거나 단어 하나만 홀로 내려가는 불균형한 줄 나눔이 가독성을 해친다. CSS만으로는 해결이 어렵다.
  • 핵심 아이디어: 래퍼 너비를 "추가 줄 나눔이 생기기 직전의 최솟값"까지 줄이면 남은 공간에서 텍스트가 자연스럽게 균형 있게 배치된다.
  • 이진 탐색 구현: 래퍼 너비는 0(최소)~전체 너비(최대) 사이에 있다는 걸 안다. 반씩 줄여가며 줄 나눔 발생 지점을 감지하고, 이후 더 작은 단위로 정밀 탐색한다.
  • 4K 디스플레이 12회 반복: 3840px에서 이진 탐색 12회면 약 1px 단위까지 수렴한다. 이진 탐색의 로그 복잡도 덕에 고해상도에서도 성능 저하가 없다.
  • CSR 레이아웃 시프트 방지: `useLayoutEffect` API를 사용해 DOM 페인트 전에 동기 실행하므로 화면에 잘못된 레이아웃이 노출되지 않는다.
  • SSR 처리: SSR 시 인라인 `<script>` 태그를 타이틀 직후에 삽입해 브라우저가 파싱하는 즉시 balancer가 실행된다. Streaming SSR에서도 동작한다.
  • 동적 크기 변화 대응: `ResizeObserver` API로 래퍼 크기 변화(윈도우 리사이즈, 폰트 로드 등)를 감지해 자동으로 재계산한다.
  • 번들 크기: 압축 후 1kB 미만으로 타이틀 렌더링 성능에 실질적 영향이 없다.
  • Next.js 13 최적화: RSC에서 `<Balancer>` 컴포넌트를 직접 사용할 수 있고 Streaming SSR 환경에서도 CLS 없이 동작한다.
왜 읽나제목/헤딩 텍스트 줄 균형을 개선하거나, 이진 탐색 기반 텍스트 레이아웃 최적화 구현 방법이 궁금한 React/Next.js 프론트엔드 개발자에게 알고리즘 원리와 SSR 레이아웃 시프트 방지 기법을 제공한다.
vercel-blog
Vercel Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 프론트엔드·LINE EngineeringLINE Engineering·

    AI로 웹 엔지니어 없이 LINE 앱 안에서 그룹 영상 통화 서비스 만들기

    LINE Planet 팀의 PM과 Android 엔지니어 두 명이 웹 전문 엔지니어 없이 LINE 앱 내에서 그룹 영상 통화 서비스를 개발한 과정을 다룬다. LIFF(LINE Front-end Framework)와 LINE Planet SDK를 활용해 React/Vite 기반 웹 앱을 구성했고, Firebase Cloud Functions로 별도 서버 인프라 없이 구현을 완료했다.

    #react#webrtc#firebase+2
  2. 프론트엔드·vercel-blogVercel Blog·

    Vercel과 Shopify의 Hydrogen 전면 재설계

    Vercel과 Shopify가 Hydrogen을 오픈소스·런타임 무관 프레임워크로 전면 재설계했다. 기존 Hydrogen은 빠른 헤드리스 스토어프런트 배포를 지원했지만 플랫폼 종속성이 있었고, 새 버전은 Svelte, Nuxt, Next.js 등 어느 JavaScript 프레임워크에서도 동작한다. 3레이어 아키텍처(코어/클라이언트/서버)로 재구성하면서 각 레이어가 명확한 역할을 분담한다.

    #react#nextjs#i18n+2
  3. 프론트엔드·토스 SLASH토스 SLASH·

    es-toolkit: 사내 소형 라이브러리에서 글로벌 프로젝트로

    토스 프론트엔드 팀이 사내 공유 유틸리티 라이브러리를 발전시켜 만든 es-toolkit이 주간 npm 다운로드 2,000만 건을 넘기며 글로벌 오픈소스 프로젝트로 자리 잡은 과정을 다룬다. lodash의 구조적 한계를 넘어 현대 웹 개발 환경에 최적화된 유틸리티 라이브러리를 처음부터 설계한 경험을 정리한다.

    #lodash#open-source#tree-shaking+2