5.6

View in English

5.6 프런트엔드 엔지니어링

개요와 동기

프런트엔드 엔지니어링은 소프트웨어의 클라이언트 대면 계층, 곧 브라우저나 기기에서 실행되어 디자인, 콘텐츠, 데이터를 동작하는 인터페이스로 바꾸는 코드를 만드는 규율입니다. 프레임워크와 아키텍처 선택, 렌더링 전략, 상태 관리, 성능, 현실 세계의 엄청나게 다양한 브라우저, 기기, 네트워크 조건에 걸친 복원력에 걸칩니다. 프런트엔드는 모든 상류의 작업(UX, 디자인, 콘텐츠, 접근성, 국제화)이 사용자에게 성공적으로 닿거나 무너지는 곳입니다.

큰 팀에게 프런트엔드는 조직이 통제하지 않는 환경에 노출되어 있다는 점에서 독특하게 어렵습니다. 사용자의 브라우저, 기기, 연결, 설정은 크게 다르고, 플랫폼(웹)은 계속 진화합니다. 규모에서 아키텍처 선택은 누적됩니다. 오늘 고른 프레임워크는 여러 해 동안 채용, 성능, 유지보수성을 제약하고, 번들 크기와 렌더링에 대한 수천 개의 작은 결정이 합쳐져 사용자가 실제로 얻는 경험이 됩니다. 공유 표준, 컴포넌트 라이브러리, 성능 예산, 아키텍처 패턴이 많은 독립 팀이 느리고, 일관성 없고, 취약한 전체를 만들지 않게 지킵니다.

기업과 정부와의 관련은 급박합니다. 기업은 프레임워크 수명과 유지보수성이 새로움보다 중요하고 많은 팀이 상호운용해야 하는 오래 사는 애플리케이션을 유지합니다. 정부는 오래된 기기, 느리거나 종량제인 연결, 보조 기술을 쓰는 사람을 포함한 대중 전체를 섬깁니다. 이는 성능, 점진적 향상, 복원력을 선택적 마감이 아니라 모두에게 동작하는 서비스와 가장 불리한 사람들을 배제하는 서비스의 차이로 만듭니다. 최신 휴대폰과 빠른 연결에서만 동작하는 정부 서비스는 임무에 실패합니다.

핵심 원칙

  • 프런트엔드는 통제하지 않는 환경에서 실행됩니다. 변동성과 실패를 위해 설계하십시오.
  • 오래 사는 시스템에는 지루하고 내구성 있는 기술을 고르십시오. 유지보수성과 채용에 최적화하십시오.
  • 성능은 기능이며, 많은 사용자에게는 접근의 전제 조건입니다.
  • 점진적 향상: 동작하는 핵심 경험을 먼저 전달한 뒤 향상을 겹치십시오.
  • 더 적은 코드를 보내십시오. 가장 빠르고 믿을 만한 코드는 출하하지 않는 코드입니다.
  • 렌더링 전략을 유행이 아니라 콘텐츠 유형과 사용자 필요에 맞추십시오.
  • 복원력: 일이 잘못될 때 인터페이스는 깨지지 않고 우아하게 성능이 저하되어야 합니다.
  • 표준과 플랫폼 기능은 프레임워크보다 오래갑니다. 플랫폼에 기대십시오.

권장 사항

유행이 아니라 수명과 적합성으로 프레임워크를 고른다

유행하는 것이 아니라 문제, 팀, 유지보수 기간, 채용 시장에 근거해 프런트엔드 기술을 고르십시오. 오래 사는 기업과 정부 시스템에는 큰 인재 풀, 안정적인 릴리스 실천, 분명한 업그레이드 경로를 가진 성숙하고 잘 지원되는 기술을 선호하십시오. 프레임워크 변동의 총비용을 따져 보십시오. 재작성은 비싸고 위험합니다. 투자가 프레임워크 교체를 견디도록 웹 표준에 기대는 접근을 선호하고, 애플리케이션이 한 라이브러리의 수명 주기에 볼모 잡히지 않도록 프레임워크 전용 코드를 경계 뒤에 격리하십시오.

렌더링 전략을 필요에 맞춘다

주요 렌더링 전략은 각각 다른 콘텐츠에 맞습니다. 서버 측 렌더링(SSR)은 빠른 첫 페인트와 좋은 SEO(검색 엔진 최적화)를 만들고 클라이언트 JavaScript 없이 동작해, 콘텐츠가 많고 공개 대면인 페이지에 맞습니다. 정적 사이트 생성(SSG)은 빌드 시점에 미리 렌더링해 최대 속도와 캐시 가능성을 주며, 드물게 바뀌는 콘텐츠에 이상적입니다. 클라이언트 측 렌더링(CSR)은 인증 뒤의 매우 상호작용적인 앱 같은 경험에 맞습니다. 스트리밍과 점진적 하이드레이션은 페이지를 점진적으로 보내고 활성화해 사용자가 콘텐츠를 더 일찍 보고 씁니다. 많은 대규모 시스템은 전역에서 하나를 고르는 대신 라우트마다 이를 섞습니다. 상태를 의도적으로 관리하십시오. 서버 상태, URL 상태, 지역 UI 상태를 구별하고, 모든 것을 하나의 무거운 전역 저장소로 과도하게 중앙화하는 것을 피하십시오.

성능을 예산이 있고 측정되는 규율로 다룬다

성능 예산(번들 크기, 요청 수, 핵심 지표의 명시적 한도)을 채택하고 CI에서 시행해 회귀가 빌드를 실패시키게 하십시오. 빠른 기계의 실험실 테스트만이 아니라 실제 기기와 네트워크의 실사용자 모니터링으로 Core Web Vitals(로딩, 상호작용성, 시각적 안정성)를 추적하십시오. JavaScript를 공격적으로 줄이십시오. 코드를 쪼개고 지연 로드해 사용자가 주어진 뷰에 필요한 것만 내려받게 하고, 핵심이 아닌 작업을 미루고, 무거운 라이브러리보다 플랫폼 기능을 선호하십시오. 이미지와 글꼴을 최적화하고, 효과적으로 캐시하고, 대표적인 저사양 기기와 느린 연결에서 측정하십시오.

점진적 향상과 복원력으로 만든다

시맨틱 HTML과 최소한의 또는 없는 JavaScript로 동작하는 기준선에서 시작해 능력 있는 클라이언트를 위해 향상시키십시오. 이는 스크립트가 로드되지 못하거나, 기기가 오래되었거나, 네트워크가 불안정할 때도 핵심 과업이 가능하게 하며, 이는 엣지 케이스가 아니라 흔한 현실입니다. 오류를 우아하게 처리하십시오. 빈 화면이나 끝없는 스피너 대신 로딩, 빈 상태, 오류, 오프라인 조건에 유용한 상태를 보이십시오. 사람들이 의존하는 서비스에는 오프라인 우선 기법을 고려해, 간헐적 연결에도 앱이 쓸 만하고 연결이 돌아오면 동기화되게 하십시오.

크로스 브라우저, 크로스 기기, 보조 호환성을 보장한다

팀 자신의 기계가 아니라 실제 분석에 근거해 사용자가 실제로 갖고 있는 브라우저, 기기, 보조 기술에 걸쳐 테스트하십시오. 최신 플랫폼 기능이 어디서나 있다고 가정하는 대신 점진적 향상과 기능 감지를 쓰십시오. 하나의 코드베이스가 휴대폰에서 데스크톱까지 섬기도록 반응형으로 만드십시오(디자인 시스템 장 참조). 접근성과 국제화를 나중의 패스가 아니라 처음부터 프런트엔드 아키텍처에 통합하십시오.

프런트엔드를 공유 인프라로 다스린다

팀이 일관되고 생산적이도록 공유 컴포넌트 라이브러리, 린팅, 포매팅, 빌드 도구를 제공하십시오. 아키텍처 지침(애플리케이션을 구조화하고, 상태를 관리하고, 번들을 쪼개는 방법)과 CI에서 시행되는 성능 예산을 확립하십시오. 매우 큰 프런트엔드에서는 팀이 독립적으로 배포하게 하는 모듈식 또는 마이크로 프런트엔드 아키텍처를 고려하되, 공짜가 아닌 추가된 복잡성과 성능 비용을 신중히 저울질하십시오.

장단점

결정장점단점
인기 있는 성숙한 프레임워크큰 인재 풀. 안정적. 지원됨레거시 무게를 질 수 있음. 최신 기능 채택이 느림
최신 프레임워크현대적 기능. 성능 이득변동 위험. 작은 인재 풀. 불확실한 수명
SSR / SSG빠른 첫 페인트. SEO. JS 없이 동작서버나 빌드 복잡성. 캐싱의 어려움
CSR (SPA)풍부한 상호작용성. 앱 같은 느낌느린 첫 로드. JS 의존. SEO와 복원력 비용
무거운 클라이언트 JavaScript풍부한 기능저사양 기기에서 나쁜 성능. 취약
점진적 향상복원력 있고 포용적이며 어디서나 동작동작하는 기준선을 정의하는 더 많은 설계 노력
마이크로 프런트엔드독립적인 팀 배포. 규모복잡성. 중복된 의존성. 성능 오버헤드

되풀이되는 트레이드오프는 풍부함과 개발자 편의 대 도달, 성능, 복원력입니다. 무거운 클라이언트 측 접근은 빠른 기계에서 만들고 시연하기 즐겁지만 약한 기기와 네트워크의 사용자를 배제합니다. 기업, 특히 정부 청중에게는 사용자를 배제하는 비용이 높고 흔히 협상할 수 없으므로, 균형을 성능, 점진적 향상, 내구성 쪽으로 기울이십시오.

팀과 논의할 질문

  1. 애플리케이션이 한 라이브러리의 수명 주기에 볼모 잡히지 않도록 프레임워크 전용 코드를 어떻게 격리합니까? 오래 사는 기업과 정부 시스템에서 프레임워크 변동은 피할 수 있는 가장 큰 비용입니다. 재작성은 비싸고 위험하며, 오늘 유행하는 라이브러리는 여러 해 동안 채용과 유지보수를 제약합니다. 웹 표준에 기대고 프레임워크 전용 코드를 분명한 경계 뒤에 두면 비즈니스 로직과 콘텐츠가 다음 프레임워크 교체를 견딥니다. 그 이음새가 어디 있는지, 새 엔지니어가 플랫폼 코드와 프레임워크 코드를 구별할 수 있는지 결정하십시오. 마지막 프레임워크 이전 비용 또는 다가오는 것의 비용 추정을 가져오십시오. 핵심 로직이 한 라이브러리의 API에 용접되어 있다면, 프레임워크 선택을 변호하기 전에 그 결합의 가격을 매기십시오.

  2. 라우트마다 렌더링 전략을 맞춥니까, 아니면 제품 전체에 하나의 전략을 강요합니까? 서버 측 렌더링은 공개 콘텐츠에 빠른 첫 페인트를 주고 클라이언트 JavaScript 없이 동작하며, 정적 생성은 드물게 바뀌는 페이지의 속도를 극대화하고, 클라이언트 렌더링은 로그인 뒤의 상호작용적이고 앱 같은 화면에 맞습니다. 전역에서 하나를 강요하면 무거운 JavaScript로 공개 페이지를 느리게 하거나 단순한 콘텐츠 페이지를 과잉 설계합니다. 이는 정부에서 도달의 문제입니다. 큰 번들이 로드된 뒤에만 동작하는 서비스는 오래된 기기와 느린 연결의 사용자를 배제하기 때문입니다. 주요 라우트를 가져와 각각에 오늘 실제로 쓰는 전략을 표시하십시오. 공개 대면 페이지가 콘텐츠를 보여 주는 데 JavaScript가 필요하다면, 그것이 의도적인 선택인지 사고인지 결정하십시오.

  3. 상태 관리는 얼마나 규율 있으며, 모든 것을 하나의 무거운 전역 저장소로 과도하게 중앙화하고 있지 않습니까? 서버 상태, URL 상태, 지역 UI 상태를 구별하면 큰 프런트엔드를 느리고 취약하게 만드는 결합과 리렌더 폭풍을 막지만, 유혹적인 기본은 모든 것을 하나의 전역 저장소에 쏟아붓는 것입니다. 이는 많은 팀이 하나의 공유 저장소를 건드려 숨은 의존성과 예측할 수 없는 성능을 낳는 규모에서 누적됩니다. 각 종류의 상태가 어디에 속하고 무엇이 전역 저장소에 속하지 않는지 합의하십시오. 필요 이상으로 리렌더링되는 컴포넌트를 가져와 이유를 따라가 보십시오. 답이 부풀어 오른 중앙 저장소라면, 결합이 굳기 전에 경계를 결정하십시오.

  4. 성능 예산은 무엇이며, CI에서 빌드를 실패시키고, 사용자가 실제로 가진 기기에서 측정됩니까? 아무도 시행하지 않는 예산은 소원이고, 팀의 빠른 노트북에서만 측정한 예산은 존재하지 않는 사용자를 기술합니다. 대규모 조직에서 예산은 수십 개 팀이 공유 표면에 기능을 더하는 동안 번들 크기와 Core Web Vitals를 통제하는 유일한 메커니즘입니다. 어느 단일 리뷰어도 모든 회귀를 눈으로 잡을 수 없기 때문입니다. 경쟁하는 압력은 전달 속도입니다. 몇 킬로바이트에 대한 하드 빌드 실패는 그것이 막는 이탈의 값을 매기기 전까지 방해로 느껴집니다. 현재 예산, 저사양 기기와 느린 연결의 실사용자 모니터링 데이터, 회귀가 빠져나간 릴리스 목록을 가져오십시오. 오래된 휴대폰과 종량제 데이터의 사람들을 포함한 대중 전체를 섬길 임무가 있는 정부에서는 예산을 중앙값이 아니라 가장 느린 10퍼센트의 사용자에 묶고 CI 관문을 협상 불가로 만드십시오.

  5. 우리 서비스 중 어느 것이 클라이언트 JavaScript 없이 동작해야 하며, 그 경로를 실제로 테스트했습니까? 점진적 향상은 주장하기 쉽고 조용히 깨뜨리기 쉽습니다. 향상된 경로는 개발자가 매일 쓰는 것이고 기준선은 테스트되지 않은 채 썩기 때문입니다. 이를 의도적으로 결정하는 것은 규모에서 중요합니다. 하나의 플랫폼에 출하하는 많은 팀이 공유 표준이 달리 말하지 않는 한 각자 스크립트가 항상 로드된다고 가정할 것이고, 하나의 하드 의존성이 번들이 실패한 누구에게든 핵심 과업을 깨뜨릴 수 있기 때문입니다. 트레이드오프는 실제입니다. 동작하는 JavaScript 없는 기준선은 설계 노력이 들고 상호작용성을 만드는 방식을 제약합니다. 핵심 사용자 여정, 각각을 스크립트를 끄거나 실패시킨 채 로드하는 테스트, 스크립트가 현장에서 실제로 로드에 실패하는 빈도의 증거를 가져오십시오. 공공 서비스에서 스크립트 하나가 시간 초과될 때 무너지는 급여나 세금 양식은 저하된 경험이 아니라 법적 의무를 완료할 수 없는 시민이므로, 기준선을 호의가 아니라 컴플라이언스 요건으로 다루십시오.

  6. 마이크로 프런트엔드는 언제 진정으로 복잡성만큼 값을 하며, 팀이 하나에 손을 뻗기 전에 누가 결정합니까? 독립적인 팀 배포는 매력적이지만, 마이크로 프런트엔드는 분산 시스템의 복잡성, 중복된 의존성, 사용자가 더 느린 로드로 치르는 성능 세금을 지닙니다. 공유된 결정 지점이 없으면 야심 찬 팀이 규모가 비용을 정당화하기 한참 전에 조직적 편의로 도입해 제품 전체가 오버헤드를 물려받습니다. 경쟁하는 고려는 자율입니다. 하나의 공유 코드베이스에 출하하는 팀은 서로를 막을 수 있고, 진정한 규모에서는 그 결합이 그 자체로 비싼 문제입니다. 표면을 건드리는 팀의 수, 오늘 실제로 겪는 배포 경합, 분할이 도입할 페이로드 중복의 측정된 추정을 가져오십시오. 아키텍처 결정이 여러 해 동안 많은 팀을 묶고 감사와 인계를 견뎌야 하는 기업과 정부 플랫폼에서는, 각 팀이 따로 결정하게 두는 대신 명시적이고 문서화된 임계값과 이동을 승인하는 소유자를 요구하십시오.

분야별 관점

스타트업. 모든 가입이 중요할 때 속도와 도달이 모두 중요하므로, 공개 페이지에 무거운 단일 페이지 앱을 쓰는 것에 저항하십시오. 마케팅과 가입 흐름을 서버 렌더링해 초기 고객이 쓰는 중급 휴대폰과 불안정한 데이터에서 빠르게 로드되게 하고, 클라이언트 측 상호작용성은 로그인 뒤의 앱에 남겨 두십시오. 조심성 없는 의존성이 페이지를 조용히 부풀리지 못하도록 CI에 단순한 번들 크기 예산 하나를 설정하고, 채용하면서 작은 코드베이스를 유지보수 가능하게 유지하도록 웹 표준에 기대십시오.

소기업. 전담 프런트엔드 전문가도 빠듯한 예산도 없으니, 맞춤형 무엇보다 잘 지원되는 주류 프레임워크나 호스팅 사이트 빌더를 선호해 큰 인재 풀에서 채용하고 유지보수를 인력으로 채우는 대신 사십시오. 선택을 내구성으로 구성하십시오. 가장 싼 옵션은 2년 안에 다시 쓰도록 강요받지 않는 것입니다. 느리거나 깨진 결제가 잃을 여유 없는 고객을 잃게 하므로, 기본으로 빠르고 모바일 친화적인 페이지와 접근 가능한 마크업을 고집하십시오.

대기업. 문제는 많은 팀에 걸친 일관성입니다. 공유 컴포넌트 라이브러리, 합의된 아키텍처 패턴, 린팅과 빌드 도구, 어느 팀도 전체를 조용히 회귀시키지 못하도록 CI에서 시행되는 성능 예산입니다. 새로움이 아니라 수명과 채용으로 프레임워크를 고르고, 다음 이전을 견디도록 프레임워크 전용 코드를 경계 뒤에 격리하고, 표면마다 렌더링 전략을 맞추십시오. 실사용자 모니터링, 거버넌스, 각 아키텍처 선택이 왜 이루어졌는지의 감사 가능한 기록과 함께 프런트엔드를 공유 인프라로 관리하십시오.

정부. 오래된 기기, 느리거나 종량제인 연결, 보조 기술을 쓰는 사람을 포함한 대중 전체를 섬기므로, 점진적 향상과 성능은 마감이 아니라 의무입니다. 시민 대면 서비스에는 동작하는 JavaScript 없는 기준선을 하드 규칙으로 삼고, 중앙값이 아니라 가장 느린 사용자에게 맞춰 페이지를 예산하고, 스크립트가 실패해도 핵심 과업을 완료할 수 있게 유지하십시오. 조달과 투명성이 적용됩니다. 단일 벤더 종속을 피하는 내구성 있고 표준에 기운 기술을 선호하고, 접근성과 성능 요건을 계약에 문서화하고, 서비스가 시연용 기기만이 아니라 가장 불리한 사용자에게 동작함을 보일 수 있어야 합니다.

사례

스타트업. 시드 단계의 한 스타트업은 마케팅 사이트와 가입 흐름을 무거운 단일 페이지 앱으로 만들고 싶은 유혹을 받았지만, 목표 고객은 흔히 불안정한 모바일 데이터에서 중급 휴대폰을 쓰는 쇼핑객이었습니다. 두 창업자는 대신 공개 페이지를 서버 렌더링해 JavaScript가 실행되기 전에 빠르게 로드되고 동작하게 하고, 클라이언트 측 상호작용성은 로그인 뒤의 앱에 남겨 두었습니다. 조심성 없는 의존성이 페이지를 조용히 부풀리지 못하도록 CI에 단순한 번들 크기 예산을 설정했습니다. 가볍고 빠른 첫 로드가 가입을 측정 가능하게 개선했고, 웹 표준에 기댄 덕에 채용하면서도 작은 코드베이스를 유지보수하기 쉽게 유지했습니다.

대기업. 한 금융 서비스 회사가 성숙한 프레임워크, 공유 컴포넌트 라이브러리, CI에서 시행되는 성능 예산으로 표준화해 방대한 내부 및 고객 애플리케이션 집합을 현대화했습니다. 렌더링 전략은 표면마다 골랐습니다. 공개 마케팅과 콘텐츠에는 서버 렌더링된 캐시 가능한 페이지, 로그인 뒤의 상호작용적 대시보드에는 클라이언트 렌더링 애플리케이션입니다. 번들 예산과 실사용자 모니터링이 릴리스 전에 회귀를 잡아 회사의 많은 팀에 걸쳐 로드 시간을 빠르게 유지했고, 이전에 비싼 재작성을 강요했던 프레임워크 변동 위험을 줄였습니다.

정부. 한 국가 디지털 서비스 팀이 점진적 향상을 하드 규칙으로 삼아 시민 대면 서비스를 만들었습니다. 모든 서비스가 먼저 시맨틱 HTML과 서버 렌더링으로 동작하고 JavaScript는 향상시킬 뿐입니다. 이는 서비스가 오래된 휴대폰, 느린 농촌 연결, 보조 기술, 곧 정부가 배제할 수 없는 인구에서 동작함을 보장합니다. 성능 예산이 저사양 기기에서 페이지를 가볍고 빠르게 유지하며, 우아한 성능 저하는 실패한 스크립트가 누구도 급여 신청을 완료하지 못하게 막지 않는다는 뜻입니다. 결과는 빠르고, 복원력 있고, 접근 가능하고, 대중 전체가 쓸 수 있는 서비스입니다.

비즈니스 사례: 동기, ROI, TCO

프런트엔드 엔지니어링 선택은 매출, 도달, 비용을 이끕니다. 성능은 전환, 참여, 과업 완료에 직접 묶여 있습니다. 더 빠른 경험은 측정 가능하게 더 느린 것을 능가하며, 약한 기기의 사용자에게 성능은 서비스를 쓰는 것과 포기하는 것의 경계입니다. 점진적 향상과 크로스 기기 지원은 접근 가능 청중을 넓히며, 정부에게는 임무이고 기업에게는 시장 점유율입니다. 건전한 프레임워크와 아키텍처 선택은 프런트엔드 엔지니어링에서 피할 수 있는 가장 큰 비용인 재작성의 빈도와 비용을 줄입니다.

TCO에서 도입 비용은 성능 예산과 테스트의 규율, 점진적 향상의 노력, 공유 도구와 컴포넌트 라이브러리에 대한 투자입니다. 도입하지 않는 비용은 사용자와 매출을 잃는 느린 경험, 저사양 및 보조 기술 사용자의 배제(정부에서는 법적 노출), 현장에서 깨지는 취약한 애플리케이션, 유행을 쫓는 비싼 프레임워크 변동과 재작성으로 치러집니다. 프런트엔드 문제는 단일 항목이 아니라 퍼진 이탈과 지원 부하로 나타나므로 과소 투자하기 쉽습니다.

리더십을 설득하려면 Core Web Vitals와 로드 시간을 전환과 완료 퍼널에 연결하고, 무거운 클라이언트 측 접근이 배제하는 사용자를 정량화하고, 과거 또는 다가오는 재작성의 비용을 내구성 있고 표준에 기운 아키텍처의 안정성에 견주어 가격을 매기십시오. 성능 예산과 점진적 향상을 위험 감소와 도달 확장으로 구성하십시오.

안티패턴과 함정

  • 프레임워크 쫓기: 사용자 이득 없이 변동을 일으키며 최신 라이브러리로 다시 쓰는 것.
  • JavaScript 전용 경험: 큰 번들이 로드되고 실행되기 전에는 아무것도 동작하지 않아 많은 사용자를 배제.
  • 빠른 기기에서만 테스트: 팀의 최신 노트북이 실제 사용자 경험을 가림.
  • 번들 크기 무시: 페이지가 어디서나 느려질 때까지 한도 없는 의존성 성장.
  • 성능 예산 없음: 릴리스마다 회귀가 조용히 누적.
  • 빈 화면 실패: 로딩, 빈 상태, 오류, 오프라인 상태가 없어 실패한 요청이 페이지를 깨뜨림.
  • 과도하게 중앙화된 전역 상태: 모든 것이 하나의 저장소에 있어 결합과 리렌더 폭풍을 낳음.
  • 성급한 마이크로 프런트엔드: 정당화할 규모 없이 분산 시스템의 복잡성과 중복된 페이로드.
  • 아키텍처에서 접근성과 i18n 무시: 나중에 높은 비용으로 덧붙이는 것.

성숙도 모델

1단계: 시작. 공유 표준 없이 팀별로 즉흥적으로 만든 프런트엔드. 무거운 클라이언트 측 코드, 성능 예산 없음, 팀 자신의 기기에서만 테스트. 프레임워크 선택은 선호나 유행으로 이루어지고, 실패한 스크립트가 사용자를 빈 화면 앞에 둘 수 있습니다.

2단계: 발전. 일부 팀이 공유 도구와 컴포넌트 라이브러리를 채택하지만 실천은 조직 전반에서 일관되지 않습니다. 성능은 예산이 있고 시행되는 것이 아니라 가끔 측정됩니다. 렌더링 전략은 콘텐츠 유형과 무관하게 균일한 경우가 많고, 크로스 기기 테스트는 제한적이고 수동입니다.

3단계: 표준화. 프레임워크와 아키텍처가 수명을 위해 의도적으로 선택되고, 그 선택이 문서화되어 조직 전체에서 시행됩니다. 렌더링 전략이 표면마다 맞춰지고, 점진적 향상과 우아한 성능 저하가 표준이며, 공유 컴포넌트 라이브러리, 린팅, 빌드 도구가 모든 팀에 적용됩니다. 크로스 브라우저, 접근성, 국제화가 덧붙여지는 것이 아니라 짜 넣어져 있습니다.

4단계: 관리. 프런트엔드가 데이터로 측정되고 통제됩니다. 성능 예산이 CI에서 시행되어 회귀가 빌드를 실패시키고, Core Web Vitals가 실제 저사양 기기와 느린 연결의 실사용자 모니터링으로 명시적 기준선에 대해 추적됩니다. 번들 크기, 오류 및 오프라인 상태 커버리지, 가장 느린 연결에서 서비스되는 사용자의 비율이 보고되고 검토되어, 결정이 의견이 아니라 증거에 근거합니다.

5단계: 오케스트레이션. 성능, 복원력, 도달이 조직 전체에서 지속적으로 개선되고 비즈니스 성과에 묶입니다. 프런트엔드는 내구성을 위해 웹 표준에 기대고, 이전이 싸도록 프레임워크 의존성을 격리하며, 기기, 플랫폼, 실사용자 데이터가 이동함에 따라 아키텍처를 적응적으로 진화시킵니다. 대중 전체와 모든 기기가 일급이고, 프런트엔드 실천은 별개의 관심사로 다뤄지는 대신 디자인, 접근성, 제품 계획과 통합됩니다.

논의를 위한 아이디어

  • 프레임워크 이전이 비용과 위험만큼 값을 한다고 언제 판단합니까?
  • 어떤 Core Web Vitals와 번들 예산이 빌드를 실패시키는 하드 임계값이어야 합니까?
  • 점진적 향상이 필수인 곳은 어디이며, 클라이언트 측 앱이 허용되는 곳은 어디입니까?
  • 많은 자율적 팀에 걸쳐 프런트엔드 아키텍처를 어떻게 일관되게 유지합니까?
  • 마이크로 프런트엔드는 언제 진정으로 복잡성만큼 값을 합니까?
  • 실제 기기와 느린 네트워크 테스트를 파이프라인에 어떻게 짜 넣어야 합니까?

핵심 요점

  • 프런트엔드는 통제하지 않는 환경에서 실행됩니다. 변동성과 실패를 위해 설계하십시오.
  • 오래 사는 시스템에는 내구성 있고 잘 지원되는 기술을 고르고 웹 표준에 기대십시오.
  • 렌더링 전략(SSR, SSG, CSR, 스트리밍)을 콘텐츠와 필요에 맞추십시오. 라우트마다 섞는 경우가 많습니다.
  • 성능을 CI에서 실사용자 데이터와 함께 시행되는 예산이 있고 측정되는 규율로 다루십시오.
  • 핵심 경험이 어디서나 동작하도록 점진적 향상으로 만드십시오.
  • JavaScript를 덜 출하하십시오. 코드를 쪼개고, 지연 로드하고, 플랫폼 기능을 선호하십시오.
  • 특히 정부에게 성능과 복원력은 공평한 접근의 전제 조건입니다.

참고 문헌과 더 읽을거리

  • Jeremy Keith, Resilient Web Design
  • Aaron Gustafson, Adaptive Web Design (progressive enhancement)
  • Steve Souders, High Performance Web Sites
  • Ilya Grigorik, High Performance Browser Networking
  • Addy Osmani, writings on performance, code-splitting, and the cost of JavaScript
  • Google, Web Vitals and web.dev performance guidance
  • MDN Web Docs, web platform and progressive enhancement references
  • Alex Russell, essays on the cost of JavaScript and device diversity
  • UK Government Digital Service, progressive enhancement and frontend guidance
  • WHATWG HTML Living Standard and W3C web platform specifications