나도오늘부터FE성능전문가!나도오늘부터FE성능전문가!
네이버아폴로FE | 손찬욱네이버아폴로FE | 손찬욱
저소개저소개
발표의신뢰도를높이기위해서내소개
네이버모바일메인FE성능개선작업
네이버모바일날씨FE성능개선작업
네이버쇼핑FE성능개선작업
네이버블로그FE성능개선작업
네이버스토어팜FE성능개선작업
네이버modoo FE성능개선작업
네이버Pay FE성능개선작업
...
오늘발표는오늘발표는
여러분에게통찰력을주기위한발표입니다.
굉장히익숙한내용에대해이야기할것입니다.
하지만, 원리에집중해서들어주세요
우리가알고있는성능에대한상식우리가알고있는성능에대한상식
성능개선은빠르면빠를수록좋다.
로딩속도는수치적으로빠르면빠를수록좋다.
특정부분의성능을개선하면개선한만큼성능향상이된다.
서비스성능이슈는개발자의무지에서나온다.
성능전문가는서비스의성능개선포인트를찾고개선할수있
다.
서비스성능개선은전문성을갖춘영역이기에아무나할수없
다.
성능분석가의관심사(GOAL)성능분석가의관심사(GOAL)
서버성능분석가의관심사는?서버성능분석가의관심사는?
서버가얼마나많은요청을처리할수있니?
TPS (Transition Per Seconds)TPS (Transition Per Seconds)
FE 성능분석가의관심사는?FE 성능분석가의관심사는?
사용자입력에얼마나빠르게반응할수있니?
LAI (Loading And Interaction)LAI (Loading And Interaction)
에라이에라이
LAI (Loading And Interaction)LAI (Loading And Interaction)
1. 초기로딩속도(Loading)
얼마나빨리페이지를볼수있는가?
2. 인터렉션속도(Interaction)
스크롤이버벅거려요
키보드를입력하는데버벅거려요.
얼마나매끄럽게애니메이션이동작하는가?
성능개선작업어떻게할것인가?성능개선작업어떻게할것인가?
(PLAN)(PLAN)
1. 대상선정하기1. 대상선정하기
가장중요한것.
숲을보기숲을보기
서비스에서가장많이사용하는화면이무엇인가?
서비스에서사용자에게가치있는화면이무엇인가?
2. 개선프로세스2. 개선프로세스
테스트에Red-Green-Refactory 프로세스가있다면...
성능개선에서는
측정(Measure)
분석(Analytic)
최적화(Optimize)
측정- 분석- 최적화- 측정- 분석- 최적화- ...
3. 언제까지?3. 언제까지?
목표에도달할때까지.
그럼목표는?
초기로딩속도3초(?)
성격급한한국인이많이쓰는...
네이버는?네이버는?
초기로딩속도
모바일: 1.5초
PC: 2초
구글은?구글은?
developers.google.com
Load는사용자에게꼭보여주어야하는부분을기준FMP
http://goo.gl/axNG6r
성능개선작업시작하기Part 1.성능개선작업시작하기Part 1.
초기로딩속도개선하기
페이지로딩과정페이지로딩과정
0:00 / 0:20
로딩속도측정/분석하기로딩속도측정/분석하기
핵심은Waterfall 차트
로딩속도개선하기로딩속도개선하기
높이를줄이고,
폭을줄이고,
간격을땡긴다.
마지막으로총체적으로점검하기.
1. 높이줄이기: Reqeust 수줄이기1. 높이줄이기: Reqeust 수줄이기
JS, CSS MergeJS, CSS Merge
CSS SpriteCSS Sprite
여러이미지를하나의Request로!
DATA URIDATA URI
캐싱되지않아도될이미지를HTML 요청에포함시켜서~!
가장효과적인방법가장효과적인방법
초기로딩시불필요없는자원은삭제하거나뒤로(Lazy)
실수로요청한자원들
초기로딩시필요없는JS
뷰포트바깥에있는이미지
가장효과적인것은뭐니뭐니해도
이미지이미지
2019/01 기준
이미지는50% 이상(전체의1.6M 중840KB)
httparchive
다른의미에서더중요한것.다른의미에서더중요한것.
브라우저는호스트당동시에연결할수있는개수가정해져있다.
요청수가많으면많을수록
사용할수있는connection 수를초과하여
다른요청은브라우저에서대기한다.
요청은줄이면줄일수록좋다
2. 폭줄이기: Request 시간줄이기2. 폭줄이기: Request 시간줄이기
많은정보를담고있는Request!
Initial ConnectionInitial Connection
HTTP 프로토콜마다Connection 활용방법이다르다.
HTTP2HTTP2가정답입니다.가정답입니다.
Time to First Byte (TTFB)Time to First Byte (TTFB)
TTFB가오래걸린다면
서버비즈니스로직이느린것서버비즈니스로직이느린것
Content DownloadContent Download
Content Download가오래걸린다면
네트워크속도가낮거나
컨텐츠의크기가큰경우이다.
minify, obfuscation, gzipminify, obfuscation, gzip
gzip 적용(content-encoding: gzip)시전체데이터량의30% 정도감소
역시나가장효과적인것은뭐니뭐니해도
큰이미지줄이기큰이미지줄이기
이미지포맷(png, webP, jpeg, ...), 이미지메타정보날리기
다른의미에서더중요한것다른의미에서더중요한것
Decode 비용
이미지데이터를RGB로변환하는과정
하지만, 매의눈을가진디자이너가원하는이미지는
레티나(device-ratio: 2) 이상
picture, source, srcset 태그를사용
<picture>
<source
srcset="IamWebp1x.webp 1x, IamWebp1x.webp 2x"
type="image/webp">
<source
srcset="IamOldJPEG.jpg 1x, IamOldJPEG.jpg 2x"
type="image/jpeg">
<img src="IamOldBrowser2x.jpg" alt="Alt Text!">
</picture>
현실적인방법은아님.
사실상요즘브라우저는다레티나이상
눈딱! 감고이미지의2배크기
3. 간격땡기기: Request 계단간격땡기기3. 간격땡기기: Request 계단간격땡기기
1. 서버로부터HTML 문자열을Stream으로받음
2. <head> 태그에포함된자원을병렬로다운로드
3. <head> 태그에포함된자원을모두실행
4. <body> 태그부터화면을그리기시작
5. DOM 구성이완료되면DOMContentLoaded 이벤트발생
6. 모든자원의로딩완료되면load 이벤트발생
A. head 안의모든자원병렬로딩
B. JS, CSS 실행시페이지랜더링Block
C. 화면에보여줄것은다그려짐. 이미지는로딩안되어있음
성능격언성능격언
head 태그에는CSS와필수JS만넣어라.
JS는body 태그마지막에넣어라. 중간중간에JS를넣지마라.
async, deferasync, defer
DOM 제어와관련이있는스크립트는defer를이용
의존성이없는스크립트는async
CSS 파일에서폰트, 이미지를사용CSS 파일에서폰트, 이미지를사용
CSS가불러진다음에CSS에서사용하는폰트, 이미지가로딩
PreloadPreload
<link rel="preload"
href="https://example.com/fonts/font.woff"
as="font" crossorigin>
<link rel="preload"
href="https://example.com/css/style.css"
as="style" crossorigin>
CSS와함께폰트, 이미지가로딩
HTTP2 Server PushHTTP2 Server Push
HTML과함께JS, CSS, 이미지가로딩
4. 총체적으로점검하기4. 총체적으로점검하기
체감속도높이기체감속도높이기
First Paint(FP): HEAD 태그종료후
First Meaningful Paint(FMP): Hero 엘리먼트가보이는시기
서비스개발자또는오너가정해야할것들서비스개발자또는오너가정해야할것들
Hero 엘리먼트는무엇인가?
Lazy 하게처리해서는안되는요소들
균형감찾기균형감찾기
각각의Request를균등한크기로맞추기
튀는놈없애기!
지나치게큰CSS, JS
성능개선작업시작하기Part 2.성능개선작업시작하기Part 2.
인터렉션속도개선하기
Case by Case!Case by Case!
하지만딱! 하나의원리로귀결!
브라우저Main Thread 괴롭히지말기
문제는바로동적언어인JavaScript
JavaScript가DOM을건들면
기본적으로Main Thread에의해Rendering Pipeline이동작!
Rendering Pipeline 이해하기Rendering Pipeline 이해하기
Javascript: JS로DOM을변경
1. Style recalculate: DOM의최종스타일을계산
2. Layout: DOM의배치와크기계산
3. Paint: 화면에그리기
4. Composite: 레이어조합하기(Help me GPU!)
1. Layout 발생하는속성건드리지않기1. Layout 발생하는속성건드리지않기
https://csstriggers.com/
예1) top 변경
예) transform 변경
2. 도와줘GPU2. 도와줘GPU
CPU (Main Thread)가아닌GPU의도움받기
composite
웹페이지는하나의거대한레이어이다.
GPU는각각의레이어를합치는작업을한다.
GPU의도움을받기위해
레이어만들기레이어만들기
브라우저가규칙에따라레이어를구성
명시적으로레이어를구성하기
translate3d, scale3d, matrix3d, will-change, ...
GPU의Side EffectGPU의Side Effect
레이어를초기구성하기는작업은CPU(Main Thread) 가진행
레이어에원래비트맵정보를복사하기때문에메모리가2배로
필요하다.
꼭! 필요한부분만레이어로만든다
3. 60 FPS (Frame Per Seconds) 보장하기3. 60 FPS (Frame Per Seconds) 보장하기
랜더링파이프가계속해서발생하는경우랜더링파이프가계속해서발생하는경우
1 Frame 은16ms 내에완료되어야한다
애니메이션을위해서는
requestAnimationFrame으로16ms 주기를보장
DOM을건드리지않는JS 코드실행시간도동일
서비스Biz 로직이대다수...
서비스개발자가가장잘고칠수있다
성능상식에대한회고성능상식에대한회고
성능개선은빠르면빠를수록좋다.
(목표를정해야한다)
로딩속도는수치적으로빠르면빠를수록좋다.
(수치가높은것보다는사용자에게보여줄Hero 컨텐츠를빠르
게보여주는게더좋다)
특정부분의성능을개선하면개선한만큼성능향상이된다.
(전체관점에서가장많이사용하는페이지를살펴보아야한다.
워터풀차트의경우전체폭이줄어줄수있도록필요한부분을
개선해야한다.)
서비스성능이슈는개발자의무지에서나온다.
(사실바빠서신경을못써서나온다. 무지는다른이야기이다.)
성능전문가는서비스의성능개선포인트를찾고개선할수있
다.
(성능개선사항을누구보다잘아는사람은서비스를개발한담당
자이다. 성능전문가는찾을수는있지만개선할수는없다.)
서비스성능개선은전문성을갖춘영역이기에아무나할수없
다.
(오늘강의만으로도여러분은충분히할수있다. 노력과관심이
중요하다.)
여러분은오늘부터여러분은오늘부터
FE성능분석전문가1일차FE성능분석전문가1일차입니다.입니다.
감사합니다.감사합니다.

NAVER TECH CONCERT_FE2019_오늘부터 나도 FE 성능분석가