guricode

[flutter-sns-project - 8] Flutter 앱에 Sentry 연동하기: 설치부터 초기화까지 본문

앱/Flutter&Dart

[flutter-sns-project - 8] Flutter 앱에 Sentry 연동하기: 설치부터 초기화까지

agentrakugaki 2025. 9. 4. 21:03

 

센트리 구성하기https://docs.sentry.io/platforms/dart/guides/flutter/#install

파워쉘에서

$downloadUrl = "https://github.com/getsentry/sentry-wizard/releases/download/v5.1.0/sentry-wizard-win-x64.exe"
Invoke-WebRequest $downloadUrl -OutFile sentry-wizard.exe
./sentry-wizard.exe -i flutter

 

 

 

프로젝트 내에서 센트리 초기화 

import 'package:flutter/widgets.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
Future<void> main() async {
  await SentryFlutter.init(
    (options) {
      options.dsn = 'https://42581d6f0bfbf152113239f124e5b691@o4509936148348928.ingest.us.sentry.io/4509961160491008';
      // Adds request headers and IP for users, for more info visit:
      // https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/
      options.sendDefaultPii = true;
      //  performance
      // Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing.
      // We recommend adjusting this value in production.
      options.tracesSampleRate = 1.0;
      //  performance
      //  profiling
      // The sampling rate for profiling is relative to tracesSampleRate
      // Setting to 1.0 will profile 100% of sampled transactions:
      // Note: Profiling alpha is available for iOS and macOS since SDK version 7.12.0
      options.profilesSampleRate = 1.0;
      //  profiling
      //  logs
      // Enable logs to be sent to Sentry
      options.enableLogs = true;
      //  logs
      //  session-replay
      // Record session replays for 100% of errors and 10% of sessions
      options.replay.onErrorSampleRate = 1.0;
      options.replay.sessionSampleRate = 0.1;
      //  session-replay
    },
    appRunner: () => runApp(
      SentryWidget(
        child: MyApp(),
      ),
    ),
  );
  // you can also configure SENTRY_DSN, SENTRY_RELEASE, SENTRY_DIST, and
  // SENTRY_ENVIRONMENT via Dart environment variable (--dart-define)
}

 

센트리 프로젝트를 구성 한 후 센트리에서 제공하는 widzard로 설치가 끝나면 초기화구성까지 되어있다.

 

1. 실행 테스트

위 설정이 끝났다면 flutter run으로 앱을 실행한다.
Sentry SDK는 기본 템플릿 안에 테스트 예외 코드를 포함하고 있어 실행 직후 자동으로 예외 이벤트가 발생한다.

  • 앱 실행 → 콘솔 로그에서 Sentry 관련 출력 확인
  • Sentry 대시보드 → Issues 탭에서 이벤트가 수집되었는지 확인

2. 테스트 코드 제거

대시보드에서 이벤트가 정상적으로 올라온 것이 확인되면, main.dart의 테스트 예외 코드는 제거한다.

 

 

 

3. 프로덕션 설정 팁

  • 샘플링 비율 조정100% 수집은 개발환경에서는 좋지만, 운영환경에서는 서버 부하와 비용이 커지므로 0.1~0.2 수준 권장.
  • options.tracesSampleRate = 0.2; options.profilesSampleRate = 0.2;

둘 다 Sentry에서 성능/프로파일링 데이터를 얼마나 수집할지 비율을 정하는 옵션이다.

  • options.tracesSampleRate
    → 트랜잭션(화면 전환, API 호출 등 성능 추적 단위)을 몇 % 전송할지 정함.
    1.0 = 100% 전송, 0.2 = 20% 전송.
  • options.profilesSampleRate
    → 프로파일링(코드 실행 시 CPU·메모리 사용, 함수 호출 시간 등)을 몇 % 전송할지 정함.
    이 값은 tracesSampleRate와 연동됨. 즉, 트레이싱이 잡힌 20% 중에서 20%만 프로파일링 데이터도 같이 전송.
  • 환경 분리
    개발/운영 DSN을 --dart-define이나 .env로 관리해서 환경에 따라 다르게 설정한다.
  • flutter run --dart-define=SENTRY_DSN=<개발 DSN> flutter build apk --dart-define=SENTRY_DSN=<운영 DSN>
  • 추가 기능
    • options.sendDefaultPii = true → 사용자 식별자 포함
    • options.enableLogs = true → SDK 내부 로그 Sentry로 전송
    • options.replay.* → 세션 리플레이 활용 가능(웹/모바일 지원 확인 필요)

 

 

DSN

  • DSN(Data Source Name) = SDK가 이벤트를 보낼 엔드포인트 주소 + 키.
  • 앱에서 발생한 에러/트레이스가 어느 Sentry 프로젝트로 들어가야 하는지 식별해 준다.

보안 측면

  • 비공개 비밀키(secret key)가 아니라 공개 발행 키(public key) 성격이다.
    → 모바일/프런트엔드 앱 코드에 그대로 포함하는 게 정상적인 사용 방식이다.
    → 노출된다고 해서 프로젝트에 직접 접근하거나 삭제 같은 관리 권한이 생기지 않는다.
  • 하지만 악의적인 사용자가 이 DSN을 알면 임의의 이벤트를 네 프로젝트에 스팸처럼 전송할 수 있다.
    → 보안 침해는 아니지만 프로젝트 데이터 오염 우려는 있다.

안전하게 쓰는 방법

  • 클라이언트 앱(FE/모바일): 지금처럼 코드에 DSN 직접 포함해도 무방.
  • 서버 사이드 비밀(관리 API Key, Auth Token 등)은 절대 코드에 넣지 않는다.
  • 운영 환경에서 DSN을 하드코딩하기 싫다면 .env / --dart-define으로 주입해서 관리하면 된다:
    const sentryDsn = String.fromEnvironment('SENTRY_DSN');
    
  • flutter run --dart-define=SENTRY_DSN=<dsn>