- 신의 (포트원)
- React가 등장하기까지
- React의 멋집, 그리고 잃어버린 것들
- FE 앱을 구성하기 위한 다양한 선택지들
- react 바깥의 FE 생태계
- 가장 적절한 도구 찾기
React가 등장하기까지
- 어떻게 최초 화면을 그릴지
- 어떻게 사용자 입력을 응답
- 상태변화의 화면 업데이트
전통적 MPA
- 갱신 시, 서버에 화면을 다시 요청
- 구현중심의 UX
jquey,Ajax
- JS코드로 작성
- 코드 복잡도 감당 힘듬
등등
초기 JS프레임워크들
- js로 SPA 만들어보려는 시도
- MVC, MVVM등의 패턴 도입 및 입력 구성의 복잡도 낮추기 위해 노력함
아쉬운 점
- MVC와 양방향 바인딩으로는 높은 복잡도의 프로덕션 앱을 감당 어려움
- HTML 기반 커스텀 템플릿 구문 자유도 한계
- 라이브러리 구현 방식 특성상 성능 한계
React의 멋짐
- 최초로 화면을 그리는 로직과 입력 화면 갱신 로직을 단일 인터페이스로 작성 가능
- UI를 선언적 인터페이스로 작성하면 실제 UI를 변경하는 일은 React가 알아서 해주면 VDOM덕에 꽤 괜찮은 성능을 보여줌
React로 오며 잃어버린 것들
- js 번들 크기 및 요구 성능 증가
- 필요 이상으로 무거워짐
- 번거롭고 복잡해진 DOM 조작
- 바닐라 JS 시절 사용한 라이브러리들이 무거워지기 시작함
- SSR 시 JS 서버 강제
- 서버에서 화면을 그리기 위해선 JS 서버가 필요해짐.
- 서버를 두 개 쓰는건 인프라 코스트에 쓸모?
리액트는 아주 유용한 프레임워크이지만, 모두의 요구사항에 대한 최적의 도구인가?
모든 것은 트레이드오프이고, 각자의 요구사항에 따라 적절한 도구를 선택해야 한다.
FE 앱 구성을 위한 선택지들
- 최초 화면
- 사용자 입력 반응 상태 업데이트
- 상태 변화에 따른 화면 업데이트
어떻게 최초 화면을 그릴지?
서버에서 서버 코드/템플릿으로 그리기
- 서버 자원등을 자유롭게 활용할 수 있음
- 번들 사이즈 제약으로부터 자유로움
- 브라우저가 HTML을 전달받는 즉시 화면을 그릴 수 있기 때문에, 첫 화면이 빠르게 그려짐
- 화면 그리려면 서버를 거쳐야 함
- 서버에서 HTM에 이미 데이터가 존재해도 전송해야하고 페이지 크기 증시킴
- 페이지 상태 유지하는 것 까다로움
- 클라이언트 동적 동작을 구현하려면 서버에서 화면을 그리는 코드를 클라이언트용으로 구현
- 서버 관리 필요성으로 인프라적 부담 증가
서버에서 빈 껍데기만 그리고 클라이언트에서 클라이언트 코드로 그리기
- 브라우저 자원들을 자유롭게 활용
- CDN 등으로 정적 파일을 서빙 가능 - 서버측 세팅 단순
- 화면을 다시 그리는 것이 빠르고 단순
-
- 실행해야될 코드 양 많아져 인터넷 환경 및 디바이스 성능 영향도가 커짐
- 클라이언트 코드 실행이 불가능한 환경에서 사용이 불가능함
- 첫 화면을 그리는데 코드 실행이 필요하기에 약간 시간이 걸릴 수 있음
서버와 클라이언트 간에 공유 가능한 코드로 그리기
- 브라우저가 HTML을 전달받는 즉시 화면을 그릴 수 있기 떄문에
-
- 코드양 증가 → 성능 영향도 커짐
- 인프라적 부담 증가
- 코드를 서버/클라 공유 가능하도록 작성
- 페이지 동적 동작을 위한 하이드레이션 과정이 필요 → 시간이 걸릴 수 있음
어떻게 최초 화면을 그릴지?
대안적 접근들
- 일부는 서버에서만 그리고 , 일부는 공유 가능한 코드로 그림
- 공유 가능한 코드로 그리면서도 하이드레이션의 필요성을 없앰
어떻게 사용자 입력에 반응하여 상태를 업데이트할지?
양방향 바인딩: 상태가 변하면 UI 값 변하고 UI 값이 변하면 상태가 변하는 것
이벤트 핸들링을 사용하는 경우, 양방향 바인딩의 경우 한눈에 알아보기 어려워지는 문제가 발생.
어떻게 상태 변화에 따라 화면을 업데이트할지?
컴포턴트 단위로 상태 변화 추적하기
- 상태가 업데이트 될 때마다 화면을 렌더링하기에 비효율적일 수 있음
- Fine-grained Reactivity
- 개별 상태 단위로 상태 변화 추적.
- 꼭 필요한 만큼만 일을 하는 특성인데 코드가 비 습관적으로 동작하는 것 같음.
리액트 바깥의 프론트엔드 생태계
- 컴파일 타임
- 런타임
- MPA
- SPA
SPA 계열 프레임워크
- 뷰
- 템플릿 구문에 기반하여 쉽게 익힐 수 있음
- 반응형 프리미티브의 활용으로 성능 향상
- 스벨트
- 상태 흐름 분석 업데이트 로직 최적화, 성능 향상
- 직관적임.
- 솔리드
- JSX 사용하여 React 유사.
- 컴파일 타임 트랜스폼의 조합으로 최적의 업데이트 로직 구성
SPA 중심 풀스택 메타프레임워크들
- Nuxt
- SvelteKit
- 서버 중심 메타 프레임워크
- 데이터 로딩 및 라우터 체계와 프로그레시브 향상 등 특화 기능 제공
- SolidStart
- Next.js에 비기는 최신 기능을 다수 제공
MPA 스타일의 프론트엔드 프레임워크들
- 아스트로
- 정적 콘텐츠 위주
- 마르코
- ebay를 위해 만듦
- 최상의 로딩 퍼포먼스 기대.
MPA 기반 서버 중심 프레임워크들
- htmx
- 고전적 템플릿 엔진 기반으로 서버 스택 유연
- 라라벨 LiveWire
- PHP의 라라벨로 그린 웹페이지에 클라이언트 동작을 추가하기 위한 프레임워크
- Turbo
- 레일즈등의 프레임워크와 함께 사용하면 서버 위주로 손쉽게 화면을 그려나갈 수 있음.
WASM 기반 프론트엔드 프레임워크들
- Dioxus
- 서버 중심의 컴포넌트 렌더링 기능
- 렙토스
- 솔리드의 러스트 버전
- 플러터
- 크로스 클라이언트 고성능 컴포넌트 제작 가능
미처 다루지 못한 것들
Lit
Vike
Analog
Yew
지속으로 생태계를 알아보려는 노력이 중요할 것 같다.
가장 적절한 도구 찾기
근거에 기반하여 도구 고르기
빠른 FCP와 LCP 확보하기 위해, SSR/SSG 지원 프레임워크
저품질 인터넷 고객 등
고려한 요구사항
- 성능 지표의 개선이 비즈니스적으로 중요
- 콘텐츠는 대체로 정적이나, 빠른 배포가 가능해야 함
- UI는 대체로 정적이나, 일부 동적인 컴포넌트가 필요
솔리드 스타트, 아일랜드 라우터
- UX 희생 없이 모든 요구사항 처리함.
Astro
- MDX 콘텐츠 관리
- 페이지가 매우 가벼움
- 동적인 UI 구현이 어려움
[결제창]
결제 버튼 클릭 후 최대한 빨리 로딩될 수 있어야 함
상대적으로 동적인 UI
SolidStart
- 스트리밍 SSR이 필요하여 구성
관리자 콘솔
- FCP, SEO 중요도가 떨어져 인프라 비용 및 코드 복잡도 최소화
정리
- 리액트와 SPA 시대가 찾아오면서 FE 앱 황금기
- 리액트와 SPA가 정답인가? 다양한 대안적 도구들이 생태계 속에 존재
- 패러다임 속에서 한 발짝 뒤로 물러서서, 제품의 특성을 고려한 최적의 기술적 선택이