TL;DR
- 루프트한자 프로필 페이지는 여러 마이크로 프런트엔드(Micro-Frontend)가 비동기적으로 로드되면서 공간을 미리 확보하지 않은 콘텐츠가 화면을 밀어내 극심한 누적 레이아웃 이동(Cumulative Layout Shift, CLS)을 일으킴.
- 예약 버튼을 누르려는 순간 가격 알림 구독 배너가 나타나면 사용자가 의도하지 않은 동의 화면을 누르게 될 수 있음.
- 12개의 연속 스크린샷에서 헤더와 사용자 정보가 바뀌고, 셀프서비스 링크가 밀려나며, 개인화 배너와 로딩 표시가 제각각 나타나는 현상이 확인됨.
- 팀별로 분리된 성능 목표와 디자인 시스템 관리 부재, 핵심 웹 바이탈(Core Web Vitals)보다 기능 출시 속도를 중시하는 조직 구조가 문제를 키움.
- 서버 측 데이터 집계, 엣지 기반 마이크로 프런트엔드 통합, 사전 레이아웃 공간 확보와 CI/CD 성능 기준 적용이 해결책으로 제시됨.
화면에서 일어나는 일
- 12개의 캡처 상태 전반에서 페이지 레이아웃이 계속 재배치됨.
- 상단 내비게이션은 기본 로고에서 일반 카테고리 링크로 바뀐 뒤, 개인화된 사용자 정보인 “Hello Radoslav Sharapanov”, 등급 정보와 검색창을 표시하도록 갑자기 다시 그려짐.
- “Baggage”, “Animals”, “Documents” 같은 핵심 셀프서비스 링크는 처음에 페이지 상단 가까이 표시되지만, 느린 서비스가 로드되면서 페이지 아래쪽으로 크게 밀려남.
- “Booking not listed?”와 “Plan your next trip” 같은 영향이 큰 카드가 공간을 미리 확보하지 않은 채 페이지 중간에 삽입됨. 그 결과 아래쪽 콘텐츠가 반복해서 접히고 펼쳐짐.
- 각 섹션에서 여러 로딩 표시가 서로 조율되지 않은 채 작동해 페이지가 속도가 제각각인 조각들의 모음처럼 느껴짐.
- 예약 버튼을 누르려는 순간 “Subscribe to Price Alerts” 배너가 손가락이 화면에 닿기 직전에 나타나면, 사용자가 원치 않는 동의 화면으로 이동할 수 있음. 이는 누적 레이아웃 이동이 극단적으로 나타나는 사례임.
기술적 원인: 통제되지 않은 분산형 마이크로 프런트엔드
- 루프트한자를 비롯한 많은 엔터프라이즈 애플리케이션은 하나의 단일 애플리케이션 대신 여러 팀이 페이지의 서로 다른 부분을 만드는 마이크로 프런트엔드 아키텍처를 사용함.
- 팀별 담당 영역은 내비게이션 및 인증 서비스, 수하물 및 셀프서비스 도구, 개인화 및 마케팅 엔진, Miles & More 로열티 통합으로 나뉨.
- 사용자가 페이지를 방문하면 각 구성 요소가 독립적으로 비동기 API 호출을 수행함. 일반 정적 링크는 100밀리초 만에 로드되고, 개인화 마케팅 엔진은 400밀리초에 응답하며, 기존 로열티 백엔드는 1,200밀리초가 걸림.
- 느리게 로드되는 모듈이 차지할 공간을 페이지에서 미리 확보하지 않으므로 API 데이터가 도착할 때마다 브라우저가 페이지의 기하 구조를 다시 계산하고, 이미 표시된 요소를 화면 아래로 밀어냄.
조직적 근본 원인: 콘웨이의 법칙
- 이 정도의 레이아웃 이동은 개발자 역량 문제라기보다 조직 구조의 문제인 경우가 많음.
- 콘웨이의 법칙(Conway’s Law)에 따르면 시스템은 이를 설계한 조직의 소통 구조를 반영함. 통합된 기술 거버넌스 없이 기업 조직이 사일로로 운영되면 사용자 경험도 예측 가능한 방식으로 무너짐.
- 팀 B는 셀프서비스 위젯의 로드 속도만으로 평가받고, 늦게 삽입된 위젯이 아래쪽 팀 C 구성 요소의 레이아웃을 망가뜨리는지는 고려하지 않음.
- 스켈레톤 화면이나 사전 할당 레이아웃 경계를 일관되게 적용하도록 강제하는 중앙 관리 주체가 없음.
- 팀은 사용자의 시각적 안정성을 지키는 일보다 개인화 프로모션 상자를 빠르게 출시하는 일에 보상을 받음.
기술적 해결책
- 클라이언트 측에서 페이지를 조립하는 대신 서버 측 집계를 적용함. 백엔드에서 마이크로서비스 데이터를 가져와 지역화된 페이지를 하나의 HTML 페이로드로 구성해 전달하면 브라우저가 첫 프레임부터 완성된 레이아웃을 렌더링함.
- 엣지 컴퓨팅 워커를 사용해 독립적인 마이크로 프런트엔드 서비스를 통합된 문서 객체 모델(DOM) 구조로 조립함. 이를 통해 클라이언트 측 API 요청이 연속해서 발생하는 현상, 제각각인 로딩 표시, 레이아웃 재계산을 유발하는 동적 DOM 삽입을 제거함.
- 느리고 우선순위가 낮은 백엔드 데이터에는 선택적 HTML 스트리밍을 적용함. 클라이언트에서 렌더링한 구성 요소를 공간이 확보되지 않은 DOM에 삽입하는 대신, 서버가 미리 렌더링한 슬롯에 HTML을 직접 스트리밍함.
조직적 해결책
- 웹 성능 거버넌스 팀을 구성함. 여러 직무가 참여하는 프런트엔드 코어 팀에 Google 핵심 웹 바이탈 같은 엄격한 성능 기준을 위반하는 릴리스를 거부할 권한을 부여함.
- CI/CD 파이프라인에서 누적 레이아웃 이동의 상한을 엄격히 적용함. 통합 파이프라인에서 Lighthouse, 최대 콘텐츠풀 페인트(LCP), 누적 레이아웃 이동(CLS) 검사를 자동화하고, 풀 리퀘스트로 CLS가 0.1을 넘으면 빌드가 자동으로 실패하도록 함.
- 팀별 API 응답 속도만 측정하는 방식에서 경험 중심 지표로 전환함. 기능 팀의 성과를 전체 페이지 안정성과 고객 상호작용 지표로 측정함.
결론
- 사용자 인터페이스는 의자 뺏기 게임처럼 느껴져서는 안 됨.
- 엄격한 디자인 지침과 레이아웃 조율 없이 마이크로서비스가 작동하면 기술적 복잡성이 사용자 경험에 그대로 드러남.
- 레이아웃 공간을 엄격히 확보하고 서버 측 집계를 활용하며 엔지니어링 사일로를 해소하면, 엔터프라이즈 플랫폼이 사용자를 어지럽게 하지 않으면서 빠르고 개인화된 콘텐츠를 제공할 수 있음.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요