개요
각 네이티브 및 클라이언트에 웹뷰 형태로 제공하고 있는 프로젝트를 서빙하던 중에 고민점이 생긴 부분이 있었다.
해당 서비스는 탭 형태로 제공이 되어 클라이언트 같은 경우는 한 웹 뷰에서는 하나의 페이지만 보인다는 것이다.
그러나 한 페이지를 로드 하는데 약 6.4초 정도의 시간이 걸려 생각보다 로드 시간이 너무 오래 걸리는 느낌이었다.
정적 이미지가 많은 프로젝트는 아니었기에 다른 부분에서 렌더링 성능을 향상해보기로 했다!
현재 성능
네트워크 탭을 열고 분석하기 시작할 때 처음 번들이 3.4MB가 걸리는 것을 확인할 수 있었다.
웹 -> 웹을 열 때는 그리 큰 문제가 아니지만 네이티브에서 웹뷰를 열어줄 때는 꽤나 많은 데이터를 가져오고 있고
탭 하나에 한 페이지 씩만 보여주기 때문에 다른 페이지는 굳이 필요가 없었다.
하지만 조금 더 확실한 정리를 위해 bundle-analyzer를 사용하여 번들 크기를 확인해보기로 했다.
웹팩 자체의 bundle-analyzer를 쓸 수도 있지만 순수 리액트만으로 개발하고 있기 때문에 조금 더 쉽게 볼 수 있는 cra-bundle-analyzer로 확인해보기로 했다.
bundle-analyzer
아니나 다를까 코드 스플리팅을 안해놨더니 번들 크기가 돌덩이만 하다...😢
제일 큰 번들의 크기가 약 3.7Mb라 상당히 큰 것을 알 수 있다...!
성능도 지금 보니.. 극악의 수준이다..ㅠㅠ
FCP도 2.1초나 걸리고 있고 TBT도 2초가 넘어가고 있다.
일단 더 큰 성능 최적화는 차차 하기로 하고 페이지 코드 스플리팅부터 먼저 해보자!
성능 개선 과정
// App.tsx
<>
<Routes>
<Route
path="/"
element={<PrivateRoute isLogin={true} component={<Home />} />}
/>
...
<Route path="/marketing" element={<Marketting />} />
</Routes>
<>
우리 프로젝트는 약 15개 페이지로 구성되어져 있다. (새삼 왜... 스플리팅을 안했지..?)
위와 같은 컴포넌트들을 스플리팅 해보자!
// App.tsx
import { Suspense, lazy } from "react";
const Home = lazy(() => import("./pages/home"));
...
<Suspense fallback={<FallbackComponent />}>
<Routes>
<Route
path="/"
element={<PrivateRoute isLogin={true} component={<Home />} />}
/>
...
<Route path="/marketing" element={<Marketting />} />
</Routes>
</Suspense>
다음과 같이 컴포넌트들을 코드 스플리팅 처리를 한 후 결과를 확인해보자.
개선 후 성능
코드 스플리팅 후 2.77MB로 줄어 들었다.
로컬기준이긴 하지만 처음 번들이 3.4MB에서 658kB로 크게 줄어든 것을 확인할 수 있었다.
번들의 로드 시간도 1.87초에서 119밀리초로 약 10배정도 빨라졌다..
아마 상용 배포가 이뤄지면 최적화가 더 되기 때문에 더 빨라질 것으로 생각된다.
성능이 압도적으로 높아지진 않았지만 그래도 Lighthouse 기준 35 -> 54로 상승되었고,
FCP도 2.4초에서 1.4초로 1초정도 단축하였다.
TPT는 3배 가량, LCP는 2배 가량 상승했으니 유의미하다고 할 수 있다!
추가적인 개선 사항이 있지만 그건 차차 포스팅해보도록 하겠다.
후기
실무에서 성능을 개선할 일이 많이 없었지만 이번 기회에 성능을 개선하게 되어서 상당히 의미가 있었다.
내 업무로 인해 우리의 애플리케이션 사용자들의 사용성이 개선되었다는 느낌에 뿌듯하다! (실제 상용서버에선 3.1초 -> 1.7초 정도 로딩 시간을 단축했다.)
앞으로도 무턱대고 성능을 최적화하기 보다 이렇게 불편함을 찾아서 그 불편함을 개선하는 개발자가 되고싶다.
'리액트' 카테고리의 다른 글
iOS 15 Input 입력 안되는 이슈 해결기 (0) | 2025.01.09 |
---|---|
진행률에 따른 텍스트 색상이 바뀌는 프로그레스바 구현하기(2) (0) | 2023.12.13 |
진행률에 따른 텍스트 색상이 바뀌는 프로그레스바 구현하기 (1) | 2023.12.07 |
Should have a queue. This is likely a bug in React. Please file an issue 해결하기 (1) | 2023.12.06 |
React VS jQuery (0) | 2023.06.21 |