coredot.today
2026년 프론트엔드 실전 팁 9가지 — 직접 재현해 보는 함정과 해법
블로그로 돌아가기
프론트엔드실전 팁React 19React CompileruseEffectEventNext.js 16INP웹 성능IME한글 입력word-breakkeep-allIntlnpm 보안공급망 공격React2Shell브라우저 호환성AI 코딩

2026년 프론트엔드 실전 팁 9가지 — 직접 재현해 보는 함정과 해법

라이브러리 고르는 법을 다룬 지난 글에 이어, 이번에는 매일 코드를 쓰는 사람이 알아야 할 습관 아홉 가지를 정리했습니다. 보안 패치는 기능 업데이트가 아니라는 것(React2Shell, Next.js 8월·9월 보안 릴리스), npm 공급망 공격에 대비해 새 버전을 하루 늦게 받는 법, React Compiler 시대의 '렌더는 순수하게' 규칙과 useEffectEvent, React 19.3과 Next.js 16.3의 변화, INP를 지키는 작업 쪼개기, 라이브러리 전에 확인할 브라우저 기본 기능, 한글 입력 중 Enter 두 번 전송 버그, keep-all·대체 글꼴·Intl로 다듬는 한국어 화면, 그리고 AI가 짠 코드를 브라우저에서 확인하는 습관. 각 팁에는 여러분의 브라우저에서 직접 재현하고 측정하는 데모 6개를 붙였습니다.

코어닷투데이2026-10-0334분

프론트엔드 실전 팁 2026 — 키보드·스톱워치·방패·돋보기·한글·체크리스트 아이콘 카드가 꽂힌 게시판 앞에서 노트북으로 작업하는 개발자크게 보기

들어가며: 도구보다 습관

지난 글에서는 무엇으로 만들지, 곧 라이브러리를 고르는 법을 다뤘습니다. 이번 글은 그다음 이야기입니다. 어떤 라이브러리를 고르든 매일 부딪히는 함정과 그것을 피하는 습관입니다.

아홉 가지는 모두 실제로 겪거나 직접 확인한 것에서 골랐습니다. 버전·날짜·지원 범위는 2026년 10월 3일 npm 레지스트리, GitHub 보안 권고, MDN 호환성 데이터(browser-compat-data 8.1.4, 10월 1일)에서 다시 확인했습니다. 그리고 각 팁마다 여러분의 브라우저에서 직접 재현하고 측정하는 데모를 붙였습니다. 말로 들으면 당연한 이야기도, 한 번 손으로 겪어 보면 오래 남습니다.

✅
아홉 가지 요약.
① 보안 패치는 기능 업데이트와 따로, 바로 적용합니다. 프레임워크도 원격 코드 실행(RCE) 취약점이 나옵니다.
② 새로 배포된 버전은 하루 늦게 받습니다. npm min-release-age, pnpm minimumReleaseAge.
③ 렌더는 순수하게. 파생 값은 state로 두지 않고, 무작위·시간은 이벤트에서, 외부 연결은 useEffectEvent로 정리합니다.
④ React 19.3과 Next.js 16.3에서 바뀐 것을 알아 둡니다(<ViewTransition>, proxy, Turbopack 캐시, TypeScript 7).
⑤ INP 200ms를 지키려면 먼저 화면을 바꾸고, 무거운 일은 쪼개서 양보합니다.
⑥ 라이브러리 전에 브라우저 기본 기능(popover, anchor, @starting-style, field-sizing 등)을 확인합니다.
⑦ 한글 입력 중 Enter는 '전송'이 아니라 '글자 확정'입니다. isComposing을 확인합니다.
⑧ 한국어 화면은 keep-all + overflow-wrap: anywhere, 대체 글꼴 폭 보정, Intl로 다듬습니다.
⑨ AI가 짠 코드는 타입 검사·린트 통과로 끝내지 말고 브라우저에서 눌러 봅니다.

1. 보안 패치는 '기능 업데이트'가 아닙니다

프론트엔드 프레임워크는 이제 서버 코드를 실행합니다. Server Components, Server Actions, 이미지 최적화, OG 이미지 생성이 모두 서버에서 돕니다. 그래서 프론트엔드 의존성의 취약점이 곧 서버 침해로 이어질 수 있습니다. 최근 1년의 큰 사건만 보겠습니다.

2025년 12월 3일
React2Shell(CVE-2025-55182): React Server Components의 역직렬화 취약점. 인증 없이 조작된 POST 요청 하나로 서버에서 코드가 실행됩니다. CVSS 10.0 만점. react-server-dom-* 19.0~19.2.0이 대상이었고 Next.js·React Router 등 RSC를 쓰는 프레임워크가 함께 영향을 받았습니다. 공개 직후 실제 공격이 관찰됐습니다. 이후에도 RSC의 서비스 거부·소스 노출 취약점 수정이 19.2.2부터 19.2.8(2026년 7월)까지 이어졌습니다.
2026년 7월 21일
Next.js 보안 릴리스: rewrites의 서버 측 요청 위조(SSRF), Edge 런타임 Server Action 페이로드 무제한 등. 16.2.11에서 수정.
2026년 8월 25일
Next.js 16.3.3 / 15.5.24: 치명(critical) 두 건. AVIF 이미지를 최적화할 때 sharp가 쓰는 libheif 취약점으로 인한 인증 없는 원격 코드 실행, Windows 서버에서의 원격 코드 실행. 원래 26일 예정이던 릴리스를 하루 앞당겼습니다.
2026년 9월 22일~30일
Next.js 16.3.6~16.3.8: next/og의 Node.js ImageResponse에 사용자 입력이 SVG로 들어갈 때의 원격 코드 실행(치명, 16.2.0 이상), 이미지 최적화 SSRF, ISR 캐시 오염 등 여러 건.

교훈은 단순합니다. 보안 릴리스는 기능 업그레이드와 분리해서, 공지된 날 바로 적용합니다. 그러려면 평소에 마이너 버전을 너무 멀리 떨어뜨려 두지 않아야 합니다. 여섯 달 묵힌 프로젝트는 패치 하나 받으려다 메이저 변경까지 같이 받게 됩니다.

⚠️
취약점 목록을 읽는 법. 권고문마다 '영향 조건'이 있습니다. 위 next/og 건은 "Node.js ImageResponse에 공격자가 조작할 수 있는 값을 SVG 내용·속성·스타일로 넣는 경우"에만 해당하고, 이미지 최적화 SSRF는 images.remotePatterns를 설정했을 때만 해당합니다. 해당하지 않으면 급하지 않은 것이 아니라, 해당하는지 확인하는 것까지가 패치 작업입니다. 확인이 어렵다면 그냥 올리는 편이 쌉니다.

습관으로 만들 것 세 가지.

  • npm audit --omit=dev(운영 의존성만)를 CI에 넣고, 치명·높음은 빌드를 막습니다.
  • GitHub의 Dependabot 보안 업데이트, 또는 Renovate의 취약점 우선 규칙을 켭니다.
  • 프레임워크 보안 공지(Next.js 블로그, React 블로그, GitHub Security Advisories)를 구독합니다.

2. 새 버전은 하루 늦게 받으세요: npm 공급망 공격 대비

창고 입구에서 컨베이어로 들어오는 상자들 중 가장 새 상자들을 달력과 돋보기를 든 경비원이 하루 붙잡아 두고, 그중 한 상자에서 작은 벌레가 고개를 내미는 장면크게 보기

2025년 9월은 npm 생태계에 경고등이 켜진 달이었습니다.

  • 9월 8일: 인기 패키지 관리자 한 명이 npm을 사칭한 피싱 메일(가짜 도메인 npmjs.help)에 계정을 빼앗겼습니다. chalk·debug·ansi-styles·strip-ansi 등 18개 패키지, 합계 주간 다운로드 약 26억 회 규모에 브라우저의 암호화폐 지갑 주소를 바꿔치기하는 코드가 들어간 버전이 배포됐습니다.
  • 9월 14~16일: 이와 별개로 Shai-Hulud라는 자기 복제형 웜이 퍼졌습니다. 감염된 패키지가 설치되면 개발자 PC와 CI의 토큰을 훔치고, 그 토큰으로 접근할 수 있는 다른 패키지에 악성 버전을 다시 배포합니다. 500개가 넘는 패키지가 감염됐습니다.

두 사건 모두 악성 버전이 배포된 뒤 몇 시간 안에 발견돼 내려졌습니다. 그래서 가장 싸고 효과 좋은 방어는 "방금 나온 버전은 바로 설치하지 않는 것"입니다. 패키지 관리자들이 이 기능을 넣었습니다.

도구설정단위·기본값
pnpmminimumReleaseAge: 1440 (pnpm-workspace.yaml)분 단위. 10.16(2025년 9월)에서 추가, 11부터 기본값 1440분(하루)
npmmin-release-age=1 (.npmrc)일 단위. 2026년 2월 추가, 기본값 없음(직접 켜야 함)
공통lockfile 커밋 + CI에서 npm ci / pnpm install --frozen-lockfile설치할 때마다 버전이 바뀌지 않게

예외는 있습니다. 보안 패치는 하루를 기다리면 안 되므로, npm의 min-release-age는 막힌 패치를 경고하고 min-release-age-exclude로 특정 패키지를 풀어 주게 되어 있습니다. 아래 도구로 의존성 하나를 직접 점검해 보세요. 누르는 순간 npm 레지스트리와 OSV.dev 취약점 데이터베이스에 실시간으로 물어봅니다.

새 패키지를 들일 때 확인할 것: 최신 버전과의 거리, 라이선스, postinstall 같은 설치 스크립트(설치하는 순간 임의 코드가 돕니다), 의존성 수, 0.x 여부(버전 고정), 알려진 취약점. 블로그 글이나 AI 답변이 알려 준 버전 번호는 그대로 믿지 말고 레지스트리에 직접 물어보세요. 지난 글을 쓸 때도 원고의 Motion 버전이 그사이에 이미 하나 지나 있었습니다.


3. 렌더는 순수하게: React Compiler 시대의 규칙

2025년 10월 7일 React Compiler 1.0이 나왔고, 같은 시기 eslint-plugin-react-hooks(6.1·7)의 권장 설정에 컴파일러 기반 규칙이 들어갔습니다. 컴파일러가 컴포넌트를 자동으로 메모이제이션하려면 렌더가 순수해야 하기 때문입니다. 이 블로그의 린트도 아래를 오류로 막습니다.

규칙잡는 것대신 할 것
react-hooks/set-state-in-effecteffect 본문에서 바로 setState (파생 값 동기화)렌더 중에 계산하거나 이벤트 핸들러에서 갱신
react-hooks/purity렌더 중 Math.random()·Date.now()이벤트 핸들러에서 만들어 state에 저장, ID는 useId()
react-hooks/refs렌더 중 ref.current 읽기·쓰기effect·이벤트·콜백 안에서만
react-hooks/immutabilityprops·state 직접 변경새 객체로 교체

규칙 이름만 보면 까다로운 제약 같지만, 지키면 실제로 렌더 횟수가 줄고 화면이 한 프레임 늦게 바뀌는 깜빡임이 사라집니다. 아래 데모에서 나쁜 예와 좋은 예를 나란히 돌려 보세요. 세 번째 탭은 React 19.2(2025년 10월 1일)에 정식으로 들어온 useEffectEvent입니다. 채팅방 연결 effect 안에서 '테마' 같은 최신 값을 읽어야 할 때, 그 값을 의존성 배열에 넣으면 테마를 바꿀 때마다 연결이 끊겼다 다시 붙습니다.

정리하면 effect는 외부 시스템과 동기화할 때만 씁니다(소켓 연결, 구독, DOM 측정). "이 값이 바뀌면 저 state도 바꾼다"는 effect가 아니라 계산입니다. 같은 시기 React 19.2에는 화면에서 숨긴 영역의 상태를 보존하는 <Activity>도 들어왔습니다. 탭을 숨겼다 다시 열 때 입력값을 잃지 않게 하는 용도입니다.


4. React 19.3과 Next.js 16.3에서 바뀐 것

React 19.3(2026년 9월 9일)의 핵심은 세 가지입니다.

  • <ViewTransition />와 addTransitionType: 브라우저 View Transition API를 React의 전환(transition)·Suspense와 연결합니다. 지금까지 document.startViewTransition 안에서 flushSync를 부르던 방식을 React가 대신 맡습니다.
  • Fragment refs: <Fragment ref>로 감싼 자식들에 포커스 관리·관찰자 등을 붙일 수 있습니다.
  • browser()(react-dom): <Suspense> 안에서 use(browser())로 "이 부분은 브라우저에서만 그린다"를 표시합니다. 서버 렌더링에서는 오류 없이 대체 화면으로 남습니다.

그리고 전환끼리 더 이상 한 렌더로 묶이지 않아서, 느린 전환 하나가 관계없는 다른 전환을 붙잡지 않습니다.

Next.js 16은 2025년 10월에 나왔고, 가장 큰 변화는 이렇습니다.

  • Turbopack이 기본 번들러가 됐습니다.
  • middleware 파일 규칙이 proxy로 이름을 바꾸는 중입니다. 지금 middleware를 쓰면 개발 서버가 경고를 띄웁니다.
  • next/dynamic의 ssr: false는 Client Component 안에서만 쓸 수 있습니다.

Next.js 16.3(2026년 8월 3일)은 16.0 이후 가장 큰 업데이트입니다.

항목내용
개발 서버 메모리디스크 캐시 + 메모리 회수로 긴 개발 세션에서 최대 90% 감소
빌드16.1의 개발용 디스크 캐시가 next build에도 기본 적용. 변하지 않은 결과물을 재사용
타입 검사typescript@^7(7월에 나온 네이티브 포트)을 설치하면 next build가 TypeScript 7로 검사
Instant Navigations (선택)부분 prefetch, 느린 이동을 찾아 주는 개발 도구, 이동 속도 회귀를 막는 Playwright 헬퍼
AI 에이전트코딩 에이전트가 설치된 버전에 맞는 문서를 읽도록 버전별 문서 제공

그리고 1장에서 본 것처럼 16.3.x는 보안 패치가 이어지고 있으니, 올린다면 최신 패치 버전으로 올리세요.


5. INP 200ms: 먼저 화면을 바꾸고, 무거운 일은 쪼개서 양보하기

두 칸으로 나뉜 브라우저 창 속 식당 주방. 왼쪽에서는 요리사가 거대한 냄비만 젓느라 손님의 호출 벨에 답하지 못하고, 오른쪽에서는 일을 작은 그릇으로 나눠 놓고 바로 돌아서 손님을 맞는다크게 보기

INP(Interaction to Next Paint)는 사용자가 누른 뒤 화면이 다음으로 그려지기까지 걸린 시간입니다. 실제 사용자의 75번째 백분위가 200ms 이하면 좋음, 500ms 초과면 나쁨입니다. 브라우저의 메인 스레드는 하나뿐이라서, 클릭 핸들러가 250ms 동안 계산을 붙잡고 있으면 그동안 화면도 입력도 멈춥니다.

해법은 두 단계입니다. ① 누른 즉시 '처리 중'을 먼저 그리고, ② 무거운 계산은 작게 쪼개 사이사이 브라우저에 양보합니다. 양보에는 scheduler.yield()가 가장 좋고(Chrome 129·Firefox 142, Safari 미지원), 없으면 setTimeout(0)으로 대신합니다. 아래 데모는 같은 일을 두 방식으로 처리하며 이 브라우저의 Event Timing API로 실제 지연을 잽니다.

ts
async function applyFilter(rows: Row[]) {
  setPending(true);                       // ① 먼저 화면을 바꾼다
  const out: Row[] = [];
  let deadline = performance.now() + 8;
  for (const row of rows) {
    if (match(row)) out.push(row);
    if (performance.now() > deadline) {   // ② 8ms마다 양보
      await (globalThis.scheduler?.yield?.() ?? new Promise((r) => setTimeout(r, 0)));
      deadline = performance.now() + 8;
    }
  }
  setResult(out);
  setPending(false);
}

제 맥(크롬 계열)에서 잰 값은 ① 한 번에 계산 280ms·304ms(개선 필요), ② 먼저 그리고 나눠서 계산 48ms·56ms(좋음)였습니다. 전체 작업 시간은 같습니다. 달라진 것은 누른 뒤 화면이 반응하기까지의 시간입니다.

정말 무거운 계산(대용량 파싱, 이미지 처리)이라면 쪼개기가 아니라 Web Worker로 메인 스레드 밖에 보냅니다. 그리고 숫자는 개발용 고성능 PC가 아니라, 개발자 도구의 CPU 스로틀링(4~6배)이나 실제 보급형 휴대전화로 잽니다.


6. 라이브러리 전에: 브라우저가 이미 해 주는 것들

도구 상자를 열자 작은 팝업 메모, 말풍선에 묶인 닻, 늘어나는 입력 상자, 스포트라이트가 칸칸이 들어 있어 무거운 라이브러리 상자를 치우는 개발자크게 보기

지난 1~2년 사이 툴팁·드롭다운·모달·자동 높이 입력창처럼 예전엔 라이브러리가 필요했던 것들이 브라우저 기본 기능이 됐습니다. 그중 주요 세 엔진(Chrome·Safari·Firefox)이 모두 지원하는 것은 이제 바로 써도 되고, 두 곳만 지원하면 지원하지 않는 곳에서도 기능이 망가지지 않게(점진적 향상) 씁니다. 아래 표는 MDN 호환성 데이터 기준 첫 지원 버전이고, 맨 왼쪽 열은 지금 이 브라우저에서 직접 확인한 결과입니다.

특히 눈여겨볼 것들입니다.

  • popover + anchor positioning(Safari 26·Firefox 147부터 세 엔진 지원): 툴팁·메뉴를 위치 계산 라이브러리 없이 만듭니다. 바깥 클릭·Esc 닫기도 popover가 처리합니다.
  • @starting-style: 새로 나타나는 요소의 등장 애니메이션을 CSS만으로 만듭니다.
  • field-sizing: content: 내용에 맞춰 늘어나는 입력창. 높이를 재는 스크립트가 필요 없습니다.
  • <button command>: 스크립트 없이 버튼으로 dialog·popover를 엽니다.

반대로 interpolate-size(height: auto 애니메이션)와 CSS if()는 아직 Chrome 계열뿐이라 실험 단계입니다.


7. 한글 입력 중 Enter는 '전송'이 아닙니다

노트북으로 메시지를 입력하고 Enter를 누르자 같은 말풍선이 연달아 튀어나오고 두 번째는 작은 조각뿐이라 놀라는 사람크게 보기

한국어 서비스에서 가장 흔하면서 가장 오래 살아남는 버그입니다. 채팅창에 "안녕하세요"를 치고 Enter를 누르면 "안녕하세요"가 가고, 곧이어 "요"가 한 번 더 갑니다. 한글은 마지막 글자를 조합하는 동안 입력기(IME)가 그 글자를 쥐고 있고, 이때 누른 Enter는 글자를 확정하는 키이기도 하기 때문입니다. 아래 두 입력창에 직접 한글로 쳐 보세요. 한글 자판이 없다면 재생 버튼으로 이벤트 순서를 볼 수 있습니다.

고치는 법은 한 줄입니다. e.nativeEvent.isComposing이 참이면 Enter를 무시합니다. 여기에 e.keyCode === 229(입력기가 처리 중인 키)를 함께 확인하는 이유는, MDN 호환성 데이터가 isComposing을 Safari에서는 27부터 지원으로 표시할 만큼 브라우저마다 동작이 달랐기 때문입니다. 채팅만이 아닙니다. 검색 자동완성, 댓글, 태그 입력, Enter로 저장하는 표 편집처럼 Enter에 동작을 건 모든 곳이 대상입니다. 일본어·중국어 입력기에서도 같은 원리로 문제가 생깁니다.


8. 한국어 화면 다듬기: keep-all, 대체 글꼴, Intl

목수 같은 조판공이 글자 없는 색색의 단어 블록을 반으로 자르지 않고 두 줄로 고르게 배열하고, 바닥에는 반으로 잘린 블록이 찡그리고 있는 장면크게 보기

디자인 시안과 실제 화면이 어긋나는 흔한 원인 세 가지입니다.

① 줄바꿈. 브라우저 기본값은 한글을 글자 단위로 끊어서 "부탁드\n려요"처럼 됩니다. word-break: keep-all로 어절 단위로 바꾸면 읽기 좋지만, 쪼갤 곳이 없는 긴 URL이 상자를 뚫고 나가므로 overflow-wrap: anywhere를 짝으로 둡니다. 제목에는 text-wrap: balance(줄 길이를 고르게), 본문에는 text-wrap: pretty(마지막 줄에 한 단어만 남는 것 방지, Firefox 미지원)를 더합니다.

② 웹폰트 대체 글꼴. 웹폰트가 도착하기 전에 그리는 대체 글꼴과 웹폰트의 폭이 다르면, 글꼴이 바뀌는 순간 줄이 바뀌며 아래 내용이 밀립니다(CLS). 제 환경(맥, 크롬 계열)에서 재 보니 이 블로그 본문 글꼴 A2z는 같은 문장에서 기본 한글 글꼴보다 약 12% 넓었습니다. 열 줄짜리 문단이라면 한 줄 넘게 밀릴 수 있는 차이입니다. 대체 글꼴에 size-adjust를 주면 흔들림이 줄어듭니다. next/font는 이 값을 자동으로 계산하지만, CDN의 @font-face로 한글 글꼴을 직접 불러오는 사이트라면 직접 챙겨야 합니다.

③ 숫자·날짜·글자 수. '1.2만', '3일 전', '10월 15일 (목)'을 문자열로 손수 만들지 말고 Intl에 맡깁니다. 요일을 손으로 적다 틀리기 쉽고(이 블로그도 지난 글 데모에서 금요일을 목요일로 적었다 고쳤습니다), 입력 글자 수 제한은 length가 아니라 Intl.Segmenter로 화면에 보이는 글자 단위로 세야 이모지·국기에서 어긋나지 않습니다.


9. AI가 짠 코드는 브라우저에서 눌러 보세요

작은 파란 로봇이 완성된 웹 페이지를 건네지만, 개발자가 실제 브라우저에서 버튼을 눌러 보자 벌레 한 마리가 튀어나와 로봇이 놀라는 장면크게 보기

마지막 팁은 지난 글을 쓰면서 겪은 일입니다. 데모 위젯 11개를 AI 코딩 도구와 함께 만들었고, 전부 타입 검사와 린트를 통과했습니다. 그런데 브라우저에서 하나씩 눌러 보자 버그가 네 개 나왔습니다.

위젯타입·린트로는 안 보인 문제원인
json-render 데모'생성 시작'을 누르면 0/9줄에서 멈춤스트림 첫 줄에는 elements가 아직 없는데 렌더러가 있다고 가정
GSAP 데모재생 전부터 장식 원이 떠 있고 무대가 비어 보임fromTo의 즉시 렌더 기본값
Pretext 데모비교 결과 차이가 거의 안 보임한글을 글자 단위로 끊어 애초에 빈 공간이 생기지 않음
진동 데모데스크톱을 "진동 가능"으로 표시데스크톱 크롬에도 navigator.vibrate 함수가 있음

넷 다 코드는 문법적으로 옳았습니다. 동작이 틀렸을 뿐입니다. 그래서 AI와 일할수록 검증 단계를 작업 흐름에 고정해 두어야 합니다.

1
타입 검사·린트·단위 테스트: 최소 조건. 통과는 출발선입니다.
2
실제 브라우저에서 클릭: Playwright 같은 도구로 페이지를 띄우고, 버튼을 누르고, 스크린샷과 콘솔 오류를 확인합니다. AI 에이전트에게도 이 단계를 시키세요.
3
모바일 폭·다른 엔진: 390px 폭에서 가로 스크롤이 생기지 않는지, Safari·Firefox에서 기능 감지 분기가 맞게 도는지.
4
내용 검증: 날짜·요일·수치·버전처럼 사람이 읽고 믿을 정보는 출처에서 다시 확인합니다.

Next.js 16.3이 코딩 에이전트용 버전별 문서를 내놓은 것도 같은 흐름입니다. AI는 학습한 시점의 API를 기억하므로, 설치된 버전의 문서를 읽게 하고 결과를 실제로 돌려 보게 하는 것이 가장 확실합니다.


마치며: 체크리스트

영역이번 주에 해 볼 것
보안npm audit --omit=dev 실행, 프레임워크 보안 공지 구독, 치명·높음은 CI에서 차단
공급망min-release-age=1(npm) 또는 pnpm 11로 하루 지연, lockfile 커밋과 npm ci
Reacteslint-plugin-react-hooks 최신 권장 설정 켜기, 파생 상태 effect 제거, useEffectEvent 적용
성능가장 많이 누르는 버튼 세 개의 INP를 CPU 스로틀링 상태에서 측정
브라우저툴팁·드롭다운 라이브러리 하나를 popover로 바꿀 수 있는지 검토
한국어Enter 동작이 있는 입력창 전부에 isComposing 확인, 제목·본문에 keep-all + overflow-wrap
AI 협업"브라우저에서 눌러 보고 스크린샷으로 확인"을 작업 완료 조건에 넣기

함께 읽으면 좋은 글: 2026년 9월 프론트엔드 라이브러리 지도

참고한 자료