이 구성이 왜 필요한가
프론트엔드 프로젝트는 배포 자체보다 배포 이후 상태를 계속 추적하는 일이 더 어렵습니다.
실제 운영에서는 이런 문제가 자주 생깁니다.
- 배포는 정상적으로 끝났는데 성능이 갑자기 떨어짐
- 특정 환경에서만 렌더링 오류가 발생함
- 사용자 경험 지표가 나빠졌는데 개발자가 늦게 알아차림
- 에러는 쌓이는데 누가 언제 확인해야 하는지 흐려짐
이런 상황을 줄이려면 배포, 성능 측정, 오류 추적, 알림이 하나의 흐름으로 연결되어 있어야 합니다.
이번 글에서는 Next.js + Vercel + Lighthouse CI + Sentry + Slack 조합으로, 배포 이후 상태를 자동으로 확인하고 팀에 바로 공유할 수 있는 프론트엔드 모니터링 파이프라인을 구성하는 방법을 정리합니다.
1. 전체 구조 개요
이번에 구축할 시스템은 다음 흐름으로 작동합니다.
1️⃣ GitHub에 코드 푸시
2️⃣ GitHub Actions에서 빌드 및 테스트 실행
3️⃣ Lighthouse CI로 배포 전 성능 점검
4️⃣ Vercel로 자동 배포
5️⃣ 배포된 서비스에서 Web Vitals와 Sentry로 성능·에러 모니터링
6️⃣ 결과 요약을 Slack으로 자동 전송
이 구조의 핵심은 “배포 후 사람이 직접 확인하지 않아도 상태를 바로 알 수 있게 만드는 것”입니다.
즉, 단순 자동 배포가 아니라 배포 → 측정 → 알림 → 개선까지 이어지는 운영 루프를 만드는 것이 목적입니다.
2. 어떤 역할을 누가 맡는가
도구가 많아 보이지만, 역할을 나누면 구조는 생각보다 단순합니다.
- GitHub Actions: 빌드, 테스트, 자동화 파이프라인 실행
- Lighthouse CI: 배포 전 성능 품질 점검
- Vercel: 실제 서비스 배포
- Sentry: 런타임 에러 및 프론트엔드 성능 추적
- Web Vitals: 실제 사용자 기준 핵심 성능 지표 수집
- Slack: 결과를 팀이 바로 볼 수 있도록 알림 전송
이 역할 분리가 잘 되어 있어야, 나중에 문제가 생겼을 때 어디에서 확인해야 하는지도 명확해집니다.
3. 프로젝트 준비
1) Next.js 설치
npx create-next-app@latest performance-monitoring-demo
cd performance-monitoring-demo
2) 의존성 추가
npm install @sentry/nextjs web-vitals @slack/web-api
npm install -D @lhci/cli
각 패키지의 역할은 아래와 같습니다.
- @lhci/cli: Lighthouse CI 자동 실행
- @sentry/nextjs: 에러 및 성능 추적
- web-vitals: 실제 사용자 기준 성능 지표 수집
- @slack/web-api: Slack 자동 리포트 전송
4. Sentry 설정
Sentry는 이 구조에서 “문제가 생겼을 때 가장 먼저 보는 곳”이 됩니다. 배포 후 오류 추적뿐 아니라 성능 문제의 원인을 좁히는 데도 유용합니다.
sentry.client.config.js
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: 1.0,
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
});
여기서 tracesSampleRate는 성능 데이터 수집 비율이고, 너무 높게 잡으면 데이터량이 많아질 수 있으므로 운영 단계에서는 트래픽 규모를 보고 조정하는 편이 좋습니다.
next.config.js
const { withSentryConfig } = require("@sentry/nextjs");
const moduleExports = {
reactStrictMode: true,
swcMinify: true,
};
const sentryWebpackPluginOptions = {
silent: true,
};
module.exports = withSentryConfig(moduleExports, sentryWebpackPluginOptions);
DSN 값은 환경변수로 분리하고, 실제 운영 환경에서는 민감 정보가 클라이언트에 노출되는 범위를 꼭 점검해야 합니다.
5. Web Vitals 측정
Lighthouse는 테스트 환경 기준 성능을 보여주지만, 실제 사용자 환경은 또 다릅니다. 그래서 Web Vitals를 함께 수집해야 배포 후 상태를 더 현실적으로 볼 수 있습니다.
_app.tsx에 추가
import { getCLS, getFID, getLCP } from 'web-vitals';
export function reportWebVitals(metric) {
fetch('/api/vitals', {
method: 'POST',
body: JSON.stringify(metric),
keepalive: true,
});
}
이렇게 하면 브라우저가 페이지를 렌더링할 때 LCP, FID, CLS 같은 핵심 지표를 수집해 서버로 전송할 수 있습니다.
6. Web Vitals 수집 API
/pages/api/vitals.js
export default async function handler(req, res) {
const metric = JSON.parse(req.body);
console.log('Received Web Vital:', metric);
// 예시: Sentry에 함께 전송
await fetch('https://sentry.io/api/YOUR_PROJECT_ID/store/', {
method: 'POST',
headers: {
'Authorization': `DSN ${process.env.NEXT_PUBLIC_SENTRY_DSN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
message: `Web Vital: ${metric.name}`,
level: 'info',
extra: metric,
}),
});
res.status(200).json({ success: true });
}
이 API는 단순 로그 수집용으로 시작해도 충분합니다. 중요한 건 “배포 후 실제 사용자 성능 데이터를 계속 쌓는다”는 점입니다.
초기에는 서버 로그만 남기고, 이후에 Sentry나 별도 저장소로 확장하는 방식도 현실적입니다.
7. Lighthouse CI 설정
Lighthouse CI는 배포 전 단계에서 성능 이상 징후를 미리 발견하는 역할을 합니다. 특히 큰 이미지, 불필요한 스크립트, 렌더링 차단 리소스 같은 문제를 조기에 볼 수 있어 유용합니다.
.github/workflows/lighthouse.yml
name: Lighthouse CI
on: [push]
jobs:
lhci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: npm ci
- name: Run Lighthouse CI
run: |
npm install -g @lhci/cli
lhci autorun --upload.target=temporary-public-storage
이렇게 설정하면 푸시 시점마다 Lighthouse를 자동 실행해 배포 전 성능 품질을 확인할 수 있습니다.
8. Slack 알림 연동
측정 데이터를 수집해도 팀이 안 보면 의미가 없습니다. 그래서 최종 결과를 Slack으로 보내면, 개발자나 팀원이 배포 직후 상태를 빠르게 공유할 수 있습니다.
/pages/api/report.js
import { WebClient } from '@slack/web-api';
const slack = new WebClient(process.env.SLACK_TOKEN);
export default async function handler(req, res) {
const { performance, errors } = JSON.parse(req.body);
const msg = `
🚀 *배포 완료 알림*
- 성능 점수: ${performance.score}
- 주요 오류: ${errors.length ? errors.join(', ') : '없음'}
`;
await slack.chat.postMessage({
channel: '#performance-alerts',
text: msg,
});
res.status(200).json({ success: true });
}
Slack 알림의 장점은 단순합니다. 누군가 직접 대시보드를 열어보지 않아도 상태를 빠르게 알 수 있다는 점입니다.
9. Vercel 환경변수
| NEXT_PUBLIC_SENTRY_DSN | Sentry DSN |
| SLACK_TOKEN | Slack API 토큰 |
| SLACK_CHANNEL | 알림 채널명 |
| VERCEL_ENV | Vercel 환경값 (production/staging 등) |
이 구조에서 민감 정보는 반드시 환경변수로 분리해야 합니다. 특히 Slack 토큰과 DSN, 외부 API 키는 Git에 직접 커밋하지 않는 것이 기본입니다.
10. 자동 보고 파이프라인 완성
GitHub Actions + Slack 연동
- name: Send Slack Report
run: |
curl -X POST https://yourdomain.com/api/report \
-H "Content-Type: application/json" \
-d '{"performance": {"score": 95}, "errors": []}'
이제 배포가 끝나면 자동으로 Slack 리포트가 전송되고, Lighthouse 결과와 Sentry 에러 정보를 함께 확인할 수 있습니다.
11. 결과 예시
Slack 메시지는 아래처럼 구성할 수 있습니다.
🚀 배포 완료 알림
- 성능 점수: 97
- 주요 오류: 없음
- Lighthouse: LCP 1.8s, FID 75ms, CLS 0.03
이렇게 되면 프론트엔드 배포 이후 상태를 바로 확인할 수 있는 루프가 생깁니다. 문제가 생기면 Slack에서 먼저 징후를 보고, 자세한 원인은 Sentry에서 추적하는 흐름으로 이어집니다.
12. 실무에서 자주 하는 개선 포인트
- Slack 메시지에 Lighthouse Report 링크 추가
- LCP > 3s, CLS > 0.1 같은 기준치 초과 시 경고 메시지 분리
- Vercel Preview와 Production 채널을 분리해 알림 노이즈 줄이기
- 성능 추이를 Notion이나 별도 DB에 기록해 추세 관리하기
처음부터 완벽한 파이프라인을 만들 필요는 없습니다. 가장 중요한 건 배포 후 상태를 눈으로 볼 수 있는 구조를 먼저 만드는 것입니다.
13. 이런 팀에 특히 잘 맞는다
- 배포 후 문제가 생겨도 나중에야 발견하는 팀
- 성능과 오류를 수동으로 확인하고 있는 팀
- 프론트엔드 운영 품질을 조금 더 체계적으로 관리하고 싶은 팀
- 배포 자동화는 되어 있지만 관측 가능성은 부족한 팀
특히 스타트업이나 소규모 팀에서는 대규모 관측 인프라를 처음부터 만들기 어렵기 때문에, 이런 조합이 현실적인 출발점이 될 수 있습니다.
14. 마무리
프론트엔드 운영은 이제 단순히 “배포되었는가”만 확인하는 단계로는 부족합니다.
중요한 것은 배포 이후 성능이 유지되는지, 오류가 생기지 않는지, 사용자 경험이 나빠지지 않는지를 계속 확인하는 것입니다.
이 글에서 다룬 Next.js + Vercel + Lighthouse CI + Sentry + Slack 조합은 그런 운영 루프를 비교적 가볍게 만드는 방법입니다.
빠른 페이지를 만드는 것은 기술이지만,
빠른 상태를 유지하는 것은 시스템입니다.
즉, 프론트엔드 개발도 이제는 개발 → 배포 → 측정 → 피드백 → 개선으로 이어지는 구조를 갖추는 쪽이 훨씬 더 현실적인 운영 방식입니다.
'frontend > javascript' 카테고리의 다른 글
| 🟨 2-34. 사용자가 체감하는 “빠른 웹” 만들기 — UX 성능 최적화와 인지 부하 설계 (0) | 2025.11.07 |
|---|---|
| 🟨 2-33. 대규모 트래픽에도 안 버벅이는 프론트엔드 — CDN, Lazy Loading, Prefetching 실전 전략 (0) | 2025.11.07 |
| 🟨 2-31. 프론트엔드 자동화의 완성 — CI/CD + 성능 모니터링 + 에러 리포팅 통합 시스템 구축 (0) | 2025.11.07 |
| 🟨 2-30. 웹 성능 모니터링과 자동 분석 — Lighthouse CI, Web Vitals, Sentry 통합 가이드 (0) | 2025.11.07 |
| 🟨 2-29. Core Web Vitals 완전 해부 — LCP, CLS, FID로 웹 성능 측정하기 (0) | 2025.11.07 |