웹용 Firebase Performance Monitoring

1. 개요

이 Codelab에서는 Firebase Performance Monitoring을 사용하여 채팅 웹 앱의 성능을 측정하는 방법을 알아봅니다. 실시간 데모를 보려면 https://fireperf-friendlychat.web.app/을 방문하세요.

3b1284f5144b54f6.png

학습 내용

  • 웹 앱에 Firebase Performance Monitoring을 추가하여 즉시 사용 가능한 측정항목 (페이지 로드 및 네트워크 요청)을 가져오는 방법
  • 맞춤 트레이스로 특정 코드 조각을 측정하는 방법
  • 커스텀 trace에 연결된 추가 맞춤 측정항목을 기록하는 방법
  • 맞춤 속성으로 실적 데이터를 추가로 분류하는 방법
  • 성능 모니터링 대시보드를 사용하여 웹 앱의 성능을 파악하는 방법

필요한 사항

  • 원하는 IDE 또는 텍스트 편집기(예: WebStorm, Atom, Sublime, VS Code)
  • 터미널/콘솔
  • 원하는 브라우저(예: Chrome)
  • Codelab의 샘플 코드 (코드를 가져오는 방법은 이 Codelab의 다음 섹션을 참고하세요.)

2. 샘플 코드 가져오기

명령줄에서 Codelab의 GitHub 저장소를 클론합니다.

git clone https://github.com/firebase/codelab-friendlychat-web

또는 Git이 설치되어 있지 않으면 저장소를 ZIP 파일로 다운로드할 수 있습니다.

시작 앱 가져오기

IDE를 사용하여 클론된 저장소에서 📁 performance-monitoring-start 디렉터리를 열거나 가져옵니다. 이 📁 performance-monitoring-start 디렉터리에는 채팅 웹 앱인 Codelab의 시작 코드가 포함되어 있습니다.

3. Firebase 프로젝트 만들기 및 설정

Firebase 프로젝트 만들기

  1. Firebase Console에서 프로젝트 추가를 클릭합니다.
  2. Firebase 프로젝트 이름을 FriendlyChat로 지정합니다.

Firebase 프로젝트의 프로젝트 ID를 기억합니다.

  1. 프로젝트 만들기를 클릭합니다.

Firebase 요금제 업그레이드

Firebase용 Cloud Storage를 사용하려면 Firebase 프로젝트가 사용한 만큼만 지불 (Blaze) 요금제를 사용해야 합니다. 즉, Cloud Billing 계정에 연결되어 있어야 합니다.

  • Cloud Billing 계정에는 신용카드와 같은 결제 수단이 필요합니다.
  • Firebase와 Google Cloud를 처음 사용하는 경우 $300 크레딧과 무료 체험판 Cloud Billing 계정을 받을 자격이 되는지 확인하세요.
  • 이벤트의 일환으로 이 Codelab을 진행하는 경우 주최자에게 사용 가능한 Cloud 크레딧이 있는지 문의하세요.

프로젝트를 Blaze 요금제로 업그레이드하려면 다음 단계를 따르세요.

  1. Firebase Console에서 요금제를 업그레이드하도록 선택합니다.
  2. Blaze 요금제를 선택합니다. 화면에 표시된 안내에 따라 Cloud Billing 계정을 프로젝트에 연결합니다.
    이 업그레이드의 일환으로 Cloud Billing 계정을 만들어야 하는 경우 업그레이드를 완료하기 위해 Firebase Console의 업그레이드 흐름으로 돌아가야 할 수 있습니다.

프로젝트에 Firebase 웹 앱 추가

  1. 웹 아이콘 58d6543a156e56f9.png을 클릭하여 새 Firebase 웹 앱을 만듭니다.
  2. 앱을 Friendly Chat라는 별칭으로 등록한 다음 이 앱의 Firebase 호스팅도 설정합니다 옆의 체크박스를 선택합니다.
  3. 앱 등록을 클릭합니다.
  4. 나머지 단계를 클릭하여 진행합니다. 지금은 화면에 표시되는 안내를 따를 필요가 없습니다. 이 Codelab의 뒷부분에서 다룹니다.

ea9ab0db531a104c.png

Firebase 인증에 Google 로그인 사용 설정

사용자가 Google 계정으로 채팅 앱에 로그인할 수 있도록 하려면 Google 로그인 방법을 사용합니다.

Google 로그인을 사용 설정해야 합니다.

  1. Firebase Console에서 왼쪽 패널의 개발 섹션을 찾습니다.
  2. 인증을 클릭한 다음 로그인 방법 탭을 클릭합니다 ( Console로 이동).
  3. Google 로그인 제공업체를 사용 설정한 다음 저장을 클릭합니다.

7f3040a646c2e502.png

Cloud Firestore 설정

웹 앱은 Cloud Firestore를 사용하여 채팅 메시지를 저장하고 새 채팅 메시지를 수신합니다.

Firebase 프로젝트에서 Cloud Firestore를 설정하는 방법은 다음과 같습니다.

  1. Firebase Console의 왼쪽 패널에서 빌드를 펼친 다음 Firestore 데이터베이스를 선택합니다.
  2. 데이터베이스 만들기를 클릭합니다.
  3. 데이터베이스 ID(default)로 설정된 채로 둡니다.
  4. 데이터베이스의 위치를 선택한 다음 다음을 클릭합니다.
    실제 앱의 경우 사용자와 가까운 위치를 선택해야 합니다.
  5. 테스트 모드로 시작을 클릭합니다. 보안 규칙에 관한 면책 조항을 읽습니다.
    이 Codelab의 후반부에서 데이터를 보호하는 보안 규칙을 추가합니다. 데이터베이스에 대한 보안 규칙을 추가하지 않은 채 앱을 공개적으로 배포하거나 노출하지 마세요.
  6. 만들기를 클릭합니다.

Firebase용 Cloud Storage 설정

웹 앱은 Firebase용 Cloud Storage를 사용하여 사진을 저장, 업로드, 공유합니다.

Firebase 프로젝트에서 Firebase용 Cloud Storage를 설정하는 방법은 다음과 같습니다.

  1. Firebase Console의 왼쪽 패널에서 빌드를 펼친 다음 스토리지를 선택합니다.
  2. 시작하기를 클릭합니다.
  3. 기본 Storage 버킷의 위치를 선택합니다.
    US-WEST1, US-CENTRAL1, US-EAST1의 버킷은 Google Cloud Storage의 '항상 무료' 등급을 활용할 수 있습니다. 다른 모든 위치의 버킷은 Google Cloud Storage 가격 책정 및 사용량을 따릅니다.
  4. 테스트 모드로 시작을 클릭합니다. 보안 규칙에 관한 면책 조항을 읽습니다.
    이 Codelab의 후반부에서 데이터를 보호하는 보안 규칙을 추가합니다. 스토리지 버킷에 대한 보안 규칙을 추가하지 않은 채 앱을 공개적으로 배포하거나 노출하지 마세요.
  5. 만들기를 클릭합니다.

4. Firebase 명령줄 인터페이스 설치하기

Firebase 명령줄 인터페이스 (CLI)를 사용하면 Firebase 호스팅을 통해 로컬에서 웹 앱을 제공하고 웹 앱을 Firebase 프로젝트에 배포할 수 있습니다.

  1. Firebase 문서의 이 안내에 따라 CLI를 설치합니다.
  2. 터미널에서 다음 명령어를 실행하여 CLI가 올바르게 설치되었는지 확인합니다.
firebase --version

Firebase CLI 버전이 v8.0.0 이상인지 확인합니다.

  1. 다음 명령어를 실행하여 Firebase CLI를 승인합니다.
firebase login

앱의 로컬 디렉터리 (이전 Codelab에서 클론한 저장소)에서 Firebase 호스팅을 위한 앱 구성을 가져오도록 웹 앱 템플릿을 설정했습니다. 하지만 구성을 가져오려면 앱을 Firebase 프로젝트와 연결해야 합니다.

  1. 명령줄에서 앱의 로컬 performance-monitoring-start 디렉터리에 액세스할 수 있는지 확인합니다.
  2. 다음 명령어를 실행하여 앱을 Firebase 프로젝트와 연결합니다.
firebase use --add
  1. 메시지가 표시되면 프로젝트 ID를 선택한 후 Firebase 프로젝트에 별칭을 지정합니다.

별칭은 여러 환경 (프로덕션, 스테이징 등)이 있는 경우에 유용합니다. 그러나 이 Codelab에서는 default 별칭을 사용하면 됩니다.

  1. 명령줄에 표시된 나머지 안내를 따릅니다.

5. Firebase Performance Monitoring과 통합

웹용 Firebase Performance Monitoring SDK와 통합하는 방법에는 여러 가지가 있습니다 (자세한 내용은 문서 참고). 이 Codelab에서는 호스팅 URL에서 성능 모니터링을 사용 설정합니다.

성능 모니터링 추가 및 Firebase 초기화

  1. src/index.js 파일을 연 다음 TODO 아래에 다음 줄을 추가하여 Firebase Performance Monitoring SDK를 포함합니다.

index.js

// TODO: Import the Firebase Performance Monitoring library here.
 import {
   getPerformance,
   trace
 } from 'firebase/performance';
  1. 또한 Firebase 프로젝트 및 사용하려는 웹 앱에 관한 정보가 포함된 구성 객체로 Firebase SDK를 초기화해야 합니다. Firebase 호스팅을 사용하고 있으므로 이 구성을 자동으로 실행하는 특수 스크립트를 가져올 수 있습니다. 이 Codelab에서는 이미 public/index.html 파일 하단에 다음 줄을 추가했지만 해당 줄이 있는지 다시 한번 확인하세요.

index.html

<!-- This script is created by webpack -->
<script type="module" src="scripts/main.js"></script>
  1. src/index.js 파일에서 TODO 아래에 다음 줄을 추가하여 성능 모니터링을 초기화합니다.

index.js

// TODO: Initialize Firebase Performance Monitoring.
getPerformance();

이제 사용자가 사이트를 사용할 때 Performance Monitoring에서 페이지 로드 및 네트워크 요청 측정항목을 자동으로 수집합니다. 자동 페이지 로드 트레이스에 대해 자세히 알아보려면 문서를 참고하세요.

첫 입력 지연 polyfill 라이브러리 추가

최초 입력 반응 시간은 사용자 상호작용에 반응하는 브라우저에 따라 앱 반응에 대한 첫인상이 결정되기 때문에 유용한 측정항목입니다.

첫 입력 지연은 사용자가 버튼이나 하이퍼링크를 클릭하는 등 페이지의 요소와 처음 상호작용할 때 시작됩니다. 브라우저에서 입력에 반응한 직후에 중지됩니다. 즉, 브라우저에서 콘텐츠를 로드하거나 파싱하지 않는다는 의미입니다.

이 polyfill 라이브러리는 성능 모니터링 통합에 선택사항입니다.

public/index.html 파일을 연 다음 다음 줄의 주석 처리를 삭제합니다.

index.html

<!-- TODO: Enable First Input Delay polyfill library. -->
<script type="text/javascript">!function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);</script>

이제 코드에서 Firebase Performance Monitoring과의 통합이 완료되었습니다.

다음 단계에서는 Firebase Performance Monitoring을 사용하여 맞춤 트레이스를 추가하는 방법을 알아봅니다. 자동 트레이스만 수집하려면 '이미지 배포 및 전송 시작' 섹션으로 이동하세요.

6. 앱에 맞춤 트레이스 추가

Performance Monitoring을 사용하면 커스텀 트레이스를 만들 수 있습니다. 맞춤 trace는 앱의 실행 블록 기간에 관한 보고서입니다. SDK에서 제공하는 API를 사용하여 맞춤 trace의 시작과 끝을 정의합니다.

  1. src/index.js 파일에서 성능 객체를 가져온 다음 이미지 메시지 업로드를 위한 맞춤 트레이스를 만듭니다.

index.js

// TODO: Create custom trace to monitor image upload.
const t = trace(perf, "saveImageMessage");
  1. 맞춤 트레이스를 기록하려면 트레이스의 시작점과 중지 지점을 지정해야 합니다. 트레이스는 타이머라고 생각하면 됩니다.

index.js

// TODO: Start the "timer" for the custom trace.
t.start();

 ...

    // TODO: Stop the "timer" for the custom trace.
    t.stop();

맞춤 트레이스가 정의되었습니다. 코드를 배포한 후 사용자가 이미지 메시지를 전송하면 맞춤 트레이스 기간이 기록됩니다. 이를 통해 실제 사용자가 채팅 앱에서 이미지를 전송하는 데 걸리는 시간을 파악할 수 있습니다.

7. 앱에 맞춤 측정항목을 추가합니다.

커스텀 trace를 상세하게 구성하면 범위 내에서 발생하는 성능 관련 이벤트에 대한 커스텀 측정항목을 기록할 수 있습니다. 예를 들어 측정항목을 사용하여 업로드 시간이 지난 단계에서 정의한 맞춤 트레이스의 이미지 크기의 영향을 받는지 조사할 수 있습니다.

  1. 이전 단계의 맞춤 트레이스 (src/index.js 파일에 정의됨)를 찾습니다.
  2. 업로드된 이미지의 크기를 기록하려면 TODO 아래에 다음 줄을 추가합니다.

index.js

 ...

// TODO: Record image size.
t.putMetric('imageSize', file.size);

 ...

이 측정항목을 사용하면 성능 모니터링에서 맞춤 트레이스 시간과 업로드된 이미지 크기를 기록할 수 있습니다.

8. 앱에 맞춤 속성 추가

이전 단계를 기반으로 커스텀 trace에서 커스텀 속성을 수집할 수도 있습니다. 맞춤 속성은 앱에 해당하는 카테고리별로 데이터를 분류하는 데 도움이 될 수 있습니다. 예를 들어 이미지 파일의 MIME 유형을 수집하여 MIME 유형이 성능에 미치는 영향을 조사할 수 있습니다.

  1. src/index.js 파일에 정의된 맞춤 트레이스를 사용합니다.
  2. 업로드된 이미지의 MIME 유형을 기록하도록 TODO 아래에 다음 줄을 추가합니다.

index.js

 ...

// TODO: Record image MIME type.
t.putAttribute('imageType', file.type);

 ...

이 속성을 사용하면 Performance Monitoring에서 업로드된 이미지 유형을 기반으로 맞춤 트레이스 시간을 분류할 수 있습니다.

9. [확장] User Timing API를 사용하여 맞춤 트레이스 추가

Firebase Performance Monitoring SDK는 비동기식으로 로드될 수 있도록 설계되어 페이지 로드 중에 웹 앱의 성능에 부정적인 영향을 미치지 않습니다. SDK가 로드되기 전에는 Firebase Performance Monitoring API를 사용할 수 없습니다. 이 시나리오에서는 User Timing API를 사용하여 커스텀 트레이스를 추가할 수 있습니다. Firebase Performance SDK는 measure()에서 기간을 가져와 맞춤 트레이스로 기록합니다.

User Timing API를 사용하여 앱 스타일 지정 스크립트 로드 시간을 측정합니다.

  1. public/index.html 파일에서 다음 줄을 추가하여 앱 스타일 지정 스크립트 로드 시작을 표시합니다.

index.html

<!-- TODO: Mark the starting of `timer` for loading App Styling script. -->
<script type="text/javascript">performance && performance.mark('loadStylingStart');</script>
  1. 다음 줄을 추가하여 앱 스타일 지정 스크립트 로드가 끝났음을 표시하고 시작과 끝 사이의 시간을 측정합니다.

index.html

<!-- TODO: Mark the ending of `timer` for loading App Styling script. Measure the duration from start to end. -->
<script type="text/javascript">
  performance && performance.mark('loadStylingEnd');
  performance && performance.measure('loadStyling', 'loadStylingStart', 'loadStylingEnd');
</script>

여기에서 만든 항목은 Firebase Performance Monitoring에서 자동으로 수집됩니다. 나중에 Firebase 성능 콘솔에서 loadStyling라는 맞춤 트레이스를 찾을 수 있습니다.

10. 이미지 배포 및 전송 시작

Firebase 호스팅에 배포

코드에 Firebase Performance Monitoring을 추가한 후 다음 단계에 따라 코드를 Firebase 호스팅에 배포합니다.

  1. 명령줄에서 앱의 로컬 performance-monitoring-start 디렉터리에 액세스할 수 있는지 확인합니다.
  2. 다음 명령어를 실행하여 파일을 Firebase 프로젝트에 배포합니다.
firebase deploy
  1. 콘솔에 다음이 표시됩니다.
=== Deploying to 'friendlychat-1234'...

i  deploying firestore, storage, hosting
i  storage: checking storage.rules for compilation errors...
✔  storage: rules file storage.rules compiled successfully
i  firestore: checking firestore.rules for compilation errors...
✔  firestore: rules file firestore.rules compiled successfully
i  storage: uploading rules storage.rules...
i  firestore: uploading rules firestore.rules...
i  hosting[friendlychat-1234]: beginning deploy...
i  hosting[friendlychat-1234]: found 8 files in ./public
✔  hosting[friendlychat-1234]: file upload complete
✔  storage: released rules storage.rules to firebase.storage/friendlychat-1234.firebasestorage.app
✔  firestore: released rules firestore.rules to cloud.firestore
i  hosting[friendlychat-1234]: finalizing version...
✔  hosting[friendlychat-1234]: version finalized
i  hosting[friendlychat-1234]: releasing new version...
✔  hosting[friendlychat-1234]: release complete

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Hosting URL: https://friendlychat-1234.firebaseapp.com
  1. 이제 Firebase 호스팅을 사용하여 완전히 호스팅되는 웹 앱을 두 개의 자체 Firebase 하위 도메인(https://<projectId>.firebaseapp.comhttps://<projectId>.web.app)에서 방문하세요.

성능 모니터링이 사용 설정되어 있는지 확인하기

Firebase Console을 열고 성능 탭으로 이동합니다. 'SDK 감지됨'이라는 시작 메시지가 표시되면 Firebase Performance Monitoring과 통합된 것입니다.

30df67e5a07d03b0.png

이미지 메시지 보내기

채팅 앱에서 이미지를 전송하여 성능 데이터를 생성합니다.

  1. 채팅 앱에 로그인한 후 이미지 업로드 버튼 13734cb66773e5a3.png을 클릭합니다.
  2. 파일 선택 도구를 사용하여 이미지 파일을 선택합니다.
  3. 맞춤 측정항목 및 맞춤 속성의 분포를 테스트할 수 있도록 여러 이미지를 전송해 보세요 (public/images/에 몇 가지 샘플이 저장됨).

선택한 이미지와 함께 새 메시지가 앱의 UI에 표시됩니다.

11. 대시보드 모니터링

웹 앱을 배포하고 사용자로서 이미지 메시지를 보낸 후 Firebase Console의 성능 모니터링 대시보드에서 성능 데이터를 검토할 수 있습니다.

대시보드에 액세스하기

  1. Firebase Console에서 Friendly Chat 앱이 있는 프로젝트를 선택합니다.
  2. 왼쪽 패널에서 품질 섹션을 찾아 실적을 클릭합니다.

기기 내 데이터 검토

성능 모니터링에서 앱의 데이터를 처리하면 대시보드 상단에 탭이 표시됩니다. 아직 데이터나 탭이 표시되지 않으면 나중에 다시 확인하세요.

  1. 기기별 탭을 클릭합니다.
  • 페이지 로드 표에는 페이지가 로드되는 동안 성능 모니터링에서 자동으로 수집하는 다양한 성능 측정항목이 표시됩니다.
  • Durations 표에는 앱 코드에서 정의한 모든 맞춤 트레이스가 표시됩니다.
  1. Durations 테이블에서 saveImageMessage를 클릭하여 trace의 특정 측정항목을 검토합니다.

e28758fd02d9ffac.png

  1. 집계를 클릭하여 이미지 크기의 분포를 검토합니다. 이 맞춤 trace의 이미지 크기를 측정하기 위해 추가한 측정항목을 확인할 수 있습니다.

c3cbcfc0c739a0a8.png

  1. 이전 단계에서 집계 옆에 있는 시간 경과를 클릭합니다. 맞춤 트레이스의 시간도 확인할 수 있습니다. 더보기를 클릭하여 수집된 데이터를 자세히 검토합니다.

16983baa31e05732.png

  1. 열리는 페이지에서 imageType을 클릭하여 이미지 MIME 유형별로 길이 데이터를 분류할 수 있습니다. 이 특정 데이터는 맞춤 트레이스에 추가한 imageType 속성으로 인해 로깅되었습니다.

8e5c9f32f42a1ca1.png

네트워크 데이터 검토

HTTP/S 네트워크 요청은 네트워크 호출의 응답 시간과 페이로드 크기를 캡처하는 보고서입니다.

  1. 실적 모니터링 대시보드의 기본 화면으로 돌아갑니다.
  2. 네트워크 탭을 클릭하여 웹 앱의 네트워크 요청 항목 목록을 확인합니다.
  3. 이를 살펴보고 느린 요청을 파악한 후 앱 성능을 개선하기 위한 수정 작업을 시작하세요.

26a2be152a77ffb9.png

12. 수고하셨습니다.

성능 모니터링을 위해 Firebase SDK를 사용 설정하고 자동 트레이스 및 맞춤 트레이스를 수집하여 채팅 앱의 실제 성능을 측정했습니다.

학습한 내용:

  • 웹 앱에 Firebase Performance Monitoring SDK 추가
  • 코드에 맞춤 트레이스를 추가합니다.
  • 커스텀 트레이스에 연결된 커스텀 측정항목을 기록합니다.
  • 맞춤 속성을 사용하여 실적 데이터 분류
  • 성능 모니터링 대시보드를 사용하여 앱 성능에 대한 유용한 정보를 얻는 방법을 알아봅니다.

자세히 알아보기: