STATUS IS UP웹사이트 최적화 위키
25가속화
성능 및 전달 / 가속화

JavaScript 성능: 메인 스레드 작업 줄이기

페이지가 머뭇거리거나 지연되는 JavaScript를 찾아 불필요한 작업을 제거하고 인터랙션을 보호하세요.

JavaScript 성능: 메인 스레드 작업 줄이기 — 시각 가이드
읽기
8 분
출처
5
재검증
2027-03-27
검토됨
수석 웹 성능 검토자
간단 답변

결정부터 시작하세요.

실제 페이지와 상호작용을 측정해 메인 스레드 작업을 줄이고, 반복적으로 비용이 가장 큰 항목부터 수정하세요. 메인 스레드는 대부분의 페이지 JavaScript와 인터페이스 작업을 한 번에 하나의 작업으로 실행합니다. 50밀리초를 넘는 작업은 긴 작업(long task)으로 간주되며, 탭·클릭·스크롤·페인트 같은 동작이 그 뒤에서 대기할 수 있습니다. 체크아웃, 검색, 내비게이션, 양식 등 민감한 여정에 먼저 우선순위를 두세요.

각 비용 항목에 대해 제거하거나, 필요할 때까지 지연시키거나, 짧은 배치로 나누거나, 경계가 있는 계산은 Web Worker로 옮기세요. 즉각적인 응답은 메인 스레드에 두고 분석 등 비필수 후속 작업은 연기하세요. 모든 서드파티 태그는 소유자가 있는 종속성으로 취급하세요. 제약된 모바일 CPU에서 재검증하고 중요 흐름에 대해서는 롤백 수단을 유지하세요.

시각 가이드

작업을 시스템 관점에서 보세요.

개별 전술을 실행하기 전에 이 지도로 문서의 의사결정 간 관계를 파악하세요.

SIU가속화
01코드를 변경하기 전에 고객 여정을 프로파일링하세요
02트레이스를 작업 큐로 읽으세요
03중요한 시점에 더 적은 코드를 배포하세요
04브라우저가 응답할 수 있도록 작업을 분할하세요
01

코드를 변경하기 전에 고객 여정을 프로파일링하세요

내비게이션 열기, 결과 필터링, 양식 제출과 같은 중요한 경로와 상호작용 하나를 선택하세요. Chrome DevTools의 Performance 패널에서 깨끗한 브라우저 상태로 기록하세요. 같은 동작을 반복해 CPU 스로틀링을 적용한 실행과 개발용 머신에서의 실행을 모두 캡처하세요. 데스크톱 트레이스는 성능이 낮은 휴대폰에서 문제를 일으키는 작업을 숨길 수 있습니다.

트레이스는 번들 보고서에서 구성요소를 비난하기 위한 것이 아니라 좁은 가설을 테스트하는 데 사용하세요. Main 플레임 차트에서 더 넓은 막대는 더 오래 걸리는 작업을 의미하고, 겹친 막대는 호출 스택을 나타냅니다. 태스크에 빨간 삼각형이 있으면 잠재적 long task를 식별한 것입니다; 이를 선택하고 태스크를 시작한 코드 링크를 따라가세요. 의미 있는 변경을 위해 전후 트레이스를 저장하세요.

순간을 포착하세요

동작 직전부터 기록을 시작하고 가시적 결과 후에 멈추세요.

반복 가능한 사례 사용

경로, 계정 상태, 동작 순서를 일관되게 유지하세요.

소유자를 지정하세요

각 최상위 비용 항목에 대해 변경할 수 있는 팀이나 벤더를 배정하세요.

02

트레이스를 작업 큐로 읽으세요

긴 작업(long task)은 조사를 시작하는 기준일 뿐, 완전한 진단은 아닙니다. W3C Long Tasks 명세는 50밀리초 이상 지속되는 작업을 보고합니다. 작업 내부에는 JavaScript 평가, 이벤트 핸들러, 스타일 재계산, 레이아웃 또는 페인트가 있을 수 있습니다. 호출 스택은 어디서 조사를 시작할지 알려 주고, 타이밍은 문제가 코드, 렌더링 또는 서드파티 프레임 중 어디에 있는지 보여 줍니다.

가치 있는 인터랙션 중 반복되는 비용을 우선순위로 두세요. 짧은 핸들러도 레이아웃을 트리거하거나 이전 작업 뒤에서 대기하면 느리게 느껴질 수 있습니다. 트레이스는 실험실 측정이므로 대표 디바이스와, 가능하면 개인정보를 고려한 필드 텔레메트리에서 수정 결과를 확인하세요.

순간을 분리하세요

스타트업 파싱은 탭 이후 핸들러와 다른 해결책이 필요합니다.

렌더링을 검사하세요

리팩터링 전에 반복되는 스타일 쓰기와 레이아웃 읽기 패턴을 찾으세요.

기준선을 유지하세요

트레이스, 시나리오, 최상위 비용을 작업 항목에 첨부하세요.

03

중요한 시점에 더 적은 코드를 배포하세요

경로와 목적별로 스크립트를 목록화하세요. 사용되지 않는 패키지, 중복, 종료된 실험, 더 이상 필요 없는 기능 코드를 제거하세요. 그런 다음 경로별이거나 드물게 사용되는 기능은 초기 경로 대신 필요할 때 로드되도록 분리하세요. 동적 로딩은 시작 작업을 줄일 수 있지만 사용자가 즉시 기능이 필요할 때 눈에 띄는 지연을 만들 수 있습니다.

컴포넌트에 전체 클라이언트 측 프레임워크가 필요한지, 유틸리티가 기존 기능을 중복하는지, 정적 HTML에 작은 개선만 더해도 충분한지 검토하세요. 지연 로드되는 모듈의 폴백 상태를 테스트하세요. 선택적 기능의 로딩을 미루더라도 페이지에 작동하지 않는 컨트롤이 표시되어서는 안 됩니다.

경로 예산을 만드세요

어떤 스크립트가 어떤 경로에서 허용되는지와 그 이유를 문서화하세요.

의도 기반 로드

선택적 편집기, 지도, 플레이어, 리포팅 뷰 같은 곳에 고려하세요.

핵심 경로 보호

인증, 접근성, 결제, 양식 완료를 테스트하고 컨트롤에 영향이 있으면 적격한 검토를 받으세요.

04

브라우저가 응답할 수 있도록 작업을 분할하세요

작은 함수로 나눈다고 해서 동기적으로 실행되는 브라우저 작업이 자동으로 분리되지는 않습니다. 긴 루프가 있다면 작업을 배치로 나누고, 먼저 사용자에게 즉시 보이는 상태를 업데이트한 뒤 계속하기 전에 제어권을 양보(yield)하세요. 그러면 배치 사이에 브라우저가 입력과 렌더링을 처리할 수 있습니다.

지원되는 경우 scheduler.yield()는 메인 스레드에 양보하고 이후에 작업을 계속합니다; 기능 감지를 하고 지원되지 않는 브라우저에는 폴백을 사용하세요. 너무 작은 연산마다 양보하지 마세요: 오버헤드가 있고 완료 시간을 늘릴 수 있습니다. 측정에서 경계를 선택하고 취소를 보존하며 오래된 결과가 최신 상태를 덮어쓰지 않도록 하세요.

UI를 우선시하세요

보이지 않는 후속 작업보다 먼저 작업이 접수되었음을 알리거나 진행 상태를 표시하세요.

경과 시간 기준으로 배치하세요

항목당 한 번이 아니라 측정된 작업이 길어지기 전에 양보하세요.

쓸모없는 지름길을 피하세요

현재 web.dev 안내는 isInputPending() 기반의 새로운 전략을 권장하지 않습니다.

05

인터페이스가 아니라 계산을 워커로 옮기세요

Web Worker는 메인 실행 스레드와 분리된 백그라운드 스레드에서 스크립트를 실행합니다. 비용이 큰 파싱, 데이터 변환, 검색 인덱싱 등 DOM 직접 접근이 필요 없는 계산에 적합합니다. 정의된 입력을 보내고 정의된 결과를 반환하며 렌더링과 가시적 상태 변경은 메인 스레드에 남겨두세요.

워커는 만능이 아닙니다. DOM을 직접 조작할 수 없고 Window를 사용할 수 없으며 일반 메시지 통신은 데이터를 복사합니다. 워커 생성, 데이터 이동, 오류 조정은 작은 계산의 경우 이득보다 비용이 클 수 있습니다. 전체 인터랙션을 측정하고 불필요한 워커는 종료하며, 워커 작업이 실패할 경우 폴백을 설계하세요.

격리된 작업을 선택하세요

입력·출력이 직렬화(serialize)되어 테스트 가능한 계산부터 시작하세요.

메시지 버전 관리

오래된 필터, 경로, 액션에 대해 생성된 결과는 폐기하세요.

접근성을 보존하세요

정상 인터페이스를 통해 의미 있는 진행 정보를 제공하세요.

06

서드파티 JavaScript를 프로덕션 종속성으로 관리하세요

애널리틱스, 광고, 실험, 소셜 임베드, 비디오 플레이어, 지원 위젯은 요청, JavaScript 평가, iframe, 종속성을 추가할 수 있습니다. 벤더 스크립트는 필요할 수 있지만 애플리케이션 팀의 직접적인 제어 밖에 있으며 성능, 개인정보, 보안, 연속성에 영향을 줄 수 있습니다. 목적, 경로, 로딩 조건, 승인자, 동의 요구사항, 제거 소유자를 목록화하세요.

조건과 계약이 허용하는 경우, 서드파티 오리진 하나를 포함했을 때와 제외했을 때의 대표 페이지를 비교하세요. 성능 도구는 비용이 큰 평가, 페이로드, 긴 작업의 귀속 정보를 드러낼 수 있습니다. 문서화된 가치가 측정된 비용을 정당화할 때만 경량 또는 지연된 통합을 유지하세요. 선택적 종속성이 느리거나 없을 때도 핵심 콘텐츠와 주요 거래 기능이 정상적으로 제공되는지 확인하세요.

영향 범위를 제한하세요

필요한 경로와 조건에서만 태그를 로드하세요.

변경 관리 검토

태그 관리자 변경을 성능, 개인정보, 보안, 롤백 검토에 포함하세요.

제거 스위치를 유지하세요

비핵심 통합을 비활성화하는 방법을 문서화하고 테스트하세요.

07

반응성을 릴리스 안전망으로 만드세요

개선 효과가 확인된 트레이스를 중요한 여정에 대한 간단한 회귀 검사로 전환하세요. 포함할 상호작용, 기기 또는 CPU 제약 조건, 기대 응답, 검토자를 정의하세요. 번들 및 서드파티 인벤토리 검토를 함께 수행해 새 패키지나 태그가 메인 스레드 작업을 조용히 다시 도입하지 못하게 하세요.

Status Is UP은 라이브 가용성 모니터링을 대체하려는 것이 아니라 사전 최적화와 안전한 수정의 근거로 이 증거를 사용합니다. 고위험 변경 전에는 롤백을 준비하고 릴리스 후 핵심 흐름을 검증하세요. 결과는 디바이스, 네트워크, 브라우저, 콘텐츠, 계정 상태에 따라 달라지므로 임계값을 보증이 아닌 가이드레일로 취급하세요.

중대한 변경을 게이트하세요

공유 내비게이션, 체크아웃, 검색, 대형 번들에 대해 전후 트레이스를 요구하세요.

롤백 연습

알려진 정상 동작을 복원하는 기능 플래그, 태그 설정, 배포 버전을 숙지하세요.

정기적으로 재검토

주요 릴리스, 벤더 변경, 디바이스 믹스 변화 후에 다시 프로파일하세요.

실행 / 검증

실무용 할 일 가이드.

  1. 01

    중요한 인터랙션 선택

    경로, 액션, 기대 응답, 고객 영향을 명명하세요.

    검증: 테스트 노트에 경로, 계정 상태, 액션, 브라우저, 디바이스 또는 CPU 설정이 기록되어 있습니다.
  2. 02

    기준선 기록

    깨끗한 상태에서 DevTools Performance로 인터랙션을 기록하세요.

    검증: 팀이 Main 플레임 차트가 포함된 트레이스를 재검토할 수 있습니다.
  3. 03

    차단 작업 찾기

    long task, 호출 스택, 렌더링, 서드파티 활동을 검사하세요.

    검증: 각 최상위 비용 항목에 지속시간, 소스 또는 오리진, 경로, 소유자가 있습니다.
  4. 04

    불필요한 스크립트 제거

    사용되지 않는 패키지, 종료된 실험, 중복, 불필요한 경로 코드를 삭제하세요.

    검증: 제거 후 빌드와 핵심 여정이 정상 작동합니다.
  5. 05

    선택적 기능 지연

    지연 상태에서도 사용할 수 있는 경우에만 선택적 기능을 나중에 로드하세요.

    검증: 새로운 페이지 테스트가 로드, 실패, 폴백을 포함합니다.
  6. 06

    긴 태스크 분할

    작업을 배치로 나누고 즉각적인 인터페이스 응답 후에 양보하세요.

    검증: 새 트레이스가 해당 인터랙션 경로의 long task를 제거하고 올바른 결과를 유지합니다.
  7. 07

    워커 평가

    입출력 메시지가 명확한 범위가 정해진 계산만 워커로 옮기세요.

    검증: 종단간 타이밍, 오류, 오래된 결과, 정리(cleanup)를 테스트했습니다.
  8. 08

    서드파티 감사

    목적, 소유자, 조건, 동의, 비용, 비활성화 절차를 기록하세요.

    검증: 모든 핵심 경로 태그에 유지, 제한, 지연, 제거 결정이 있습니다.
  9. 09

    제약 조건에서 테스트

    가능한 경우 CPU 스로틀링 및 대표 브라우저·디바이스에서 반복하세요.

    검증: 비교가 동일한 시나리오를 사용하고 중요한 차이를 기록합니다.
  10. 10

    롤백을 포함한 릴리스

    트레이스, 승인 검사, 되돌리는 방법을 릴리스에 첨부하세요.

    검증: 지정된 소유자가 문서화된 절차만으로 알려진 정상 동작을 복원할 수 있습니다.
토론 주제

트레이드오프를 비교하세요 — 개인정보는 공유하지 마세요.

이 프롬프트를 팀이나 웹사이트 소유자 커뮤니티와 함께 사용하세요. 방법과 교훈은 공유하되, 인증 정보·고객 기록·비공개 인프라 세부사항은 절대 붙여넣지 마세요.

  1. 01

    로딩 보고서에서는 허용 가능한 것처럼 보였지만 실제 탭이나 클릭을 프로파일링했을 때 느리다고 드러난 인터랙션은 무엇인가요?

  2. 02

    서드파티 기능이 측정된 메인 스레드 비용을 정당화하는지 어떻게 결정하나요?

  3. 03

    성능 회귀를 핵심 여정을 방해하지 않고 가장 쉽게 되돌릴 수 있게 만드는 롤백 메커니즘은 무엇인가요?

주요 / 신뢰할 수 있는 자료

출처 자료 열기

web.devOptimize long tasks ↗

long task, yielding, scheduler.yield(), 폴백 및 yield 오버헤드를 설명합니다.

검토일: 2026-09-27
Chrome for DevelopersAnalyze runtime performance ↗

기록, 플레임 차트 분석, long-task 식별, 소스 조사 방법을 보여줍니다.

검토일: 2026-09-27
MDN Web DocsWeb Workers API ↗

워커, 메시지 통신, 직접 DOM 제한을 정의합니다.

검토일: 2026-09-27
web.devLoad Third-Party JavaScript ↗

서드파티 스크립트 감사 및 측정 가이던스를 제공합니다.

검토일: 2026-09-27
W3CLong Tasks API ↗

long task, 임계값, 귀속(attribution)을 정의합니다.

검토일: 2026-09-27

출처 정책 이 문서는 편집팀이 검토한 공식 브라우저, 표준 및 웹 플랫폼 문서를 사용합니다. 측정과 보증을 구별하며 근거 없는 주장은 생략합니다.

빠른 설명

자주 묻는 질문

긴 JavaScript 태스크는 무엇으로 간주되나요?

W3C Long Tasks 명세는 50밀리초 이상을 보고 기준으로 사용합니다. 이는 조사 신호일 뿐, 더 짧은 작업이 무해하다는 증거는 아닙니다. 트레이스에서 원인을 확인하세요.

코드 스플리팅은 항상 JavaScript 성능을 개선하나요?

아니요. 스플리팅은 스타트업 작업을 줄일 수 있지만 첫 사용 지연을 추가할 수 있습니다. 경로별 또는 선택적 코드에 사용하고 제약된 조건에서 해당 기능을 테스트하세요.

모든 비용이 큰 함수가 Web Worker에서 실행되어야 하나요?

아니요. 워커는 정의된 메시지를 주고받을 수 있는 격리된 CPU 집중 계산에 적합합니다. 워커는 DOM을 직접 변경할 수 없고 데이터 전송에 시간이 들며 작은 작업은 메인 스레드에서 더 빨리 끝날 수 있습니다.

Status Is UP Editorial Team · 업타임 인에이블먼트 편집팀

검토자: 수석 웹 성능 검토자. 게시 2026-09-27; 업데이트 2026-09-30.