어제 오늘 내일

[Spring Boot] "사용자가 신고하기 전까지 몰랐다고?" 실시간 에러 추적: Sentry 연동 (feat. Slack 알림) 본문

IT/SpringBoot

[Spring Boot] "사용자가 신고하기 전까지 몰랐다고?" 실시간 에러 추적: Sentry 연동 (feat. Slack 알림)

hi.anna 2026. 3. 28. 00:52

 
서버 개발자의 가장 큰 수치심은 "사용자가 먼저 에러를 발견하는 것"입니다.
"로그 파일에 다 남아있는데요?"라고 변명해 봤자 소용없습니다. 이미 고객은 떠났으니까요.
우리는 수동적(Passive)인 로그 파일 확인에서 벗어나, 능동적(Active)인 알림 시스템을 구축해야 합니다. 전 세계 개발자들이 가장 사랑하는 도구, Sentry가 정답입니다.


1. Sentry가 뭔가요?

단순히 "에러 났다"고 알려주는 게 아닙니다.

  • 어떤 사용자가 (ID, 이메일)
  • 어떤 환경에서 (OS, 브라우저 버전)
  • 어떤 코드 몇 번째 줄에서 (Stack Trace)
  • 무슨 값을 넣었길래 (Request Body)

이 모든 정보를 스냅샷처럼 찍어서 예쁜 대시보드로 보여줍니다. 심지어 Jira 이슈를 자동으로 생성하거나 Slack으로 알림을 쏴줍니다.


2. 가입 및 프로젝트 생성 (무료)

  1. Sentry.io에 접속해서 회원가입을 합니다. (Developer 플랜은 개인에게 무료입니다.)
  2. Create Project -> Spring Boot 선택 -> Create Project 클릭.
  3. 화면에 나오는 DSN (Data Source Name) 주소를 복사해 둡니다. (이게 우리 서버랑 Sentry를 연결하는 열쇠입니다.)

3. 스프링 부트 연동 (3분 컷)

Sentry는 스프링 부트용 스타터를 제공해서 설정이 너무 쉽습니다.

① 의존성 추가 ()

dependencies {
    implementation 'io.sentry:sentry-spring-boot-starter:7.3.0' // 최신 버전 확인 필요
    implementation 'io.sentry:sentry-logback:7.3.0' // Logback 연동 (선택)
}

② 설정 파일 ()

복사해 둔 DSN을 붙여넣습니다.

sentry:
  dsn: "https://your-public-key@o0.ingest.sentry.io/0" # 복사한 DSN 주소
  # 1.0 = 100% (모든 에러 전송), 0.5 = 50% (샘플링)
  traces-sample-rate: 1.0 
  # 프로덕션 환경에서만 동작하게 설정 가능
  environment: production 

4. 사용법: 자동 감지와 수동 전송

① 자동 감지 (Uncaught Exception)

스프링 부트가 시작되면 Sentry가 자동으로 감시를 시작합니다.
Controller에서 예외(throw new RuntimeException("테스트"))를 던져보세요.
5초 뒤에 Sentry 대시보드에 "New Issue Created"라며 에러가 뜹니다.

② 수동 전송 ()

try-catch로 잡은 에러는 밖으로 던져지지 않아서 Sentry가 모를 수 있습니다. 이럴 땐 직접 알려줘야 합니다.

@Service
@Slf4j
public class OrderService {

    public void order() {
        try {
            // 위험한 로직...
        } catch (Exception e) {
            log.error("주문 실패", e); // 로그 파일엔 남지만...
            Sentry.captureException(e); // ★ Sentry에도 알려줘!
        }
    }
}

5. 핵심 기능: Slack 연동 (알림봇)

이게 핵심입니다. Sentry 웹사이트를 계속 보고 있을 순 없으니까요.

  1. Sentry 웹 -> Settings -> Integrations
  2. Slack 검색 -> Add Installation
  3. 내 슬랙 워크스페이스 선택 -> 채널 지정 (#server-errors)
  4. 이제 에러가 터지면 슬랙으로 즉시 알림이 옵니다.

"망했다... NullPointerException 터짐 (OrderService.java:45)"
이 메시지를 받고 바로 노트북을 열면, 사용자가 고객센터에 전화하기 전에 문제를 해결할 수 있습니다. 🚀


6. 민감 정보 필터링 (개인정보 보호)

Sentry는 기본적으로 HTTP 요청의 헤더와 바디를 수집합니다.
하지만 사용자의 비밀번호나 주민번호가 Sentry 서버에 저장되면 큰일 나겠죠?

@Bean
public SentryOptions.BeforeSendCallback beforeSendCallback() {
    return (event, hint) -> {
        // 특정 예외는 무시하거나
        if (event.getThrowable() instanceof IgnoredException) {
            return null;
        }

        // 민감한 정보 마스킹 처리 (User IP 제거 등)
        event.getRequest().getHeaders().remove("Authorization");
        return event;
    };
}

마치며

오늘의 결론입니다.

  1. 로그 파일은 기록용이지 알림용이 아니다.
  2. Sentry를 쓰면 에러 발생 상황(Context)을 완벽하게 파악할 수 있다.
  3. Slack 연동을 통해 "사용자보다 먼저" 에러를 인지하는 개발자가 되자.

이제 여러분은 퇴근 후에도 안심할 수 있습니다. (혹은 슬랙 알림 때문에 더 불안해질 수도... 😂 농담입니다. 빠른 대응이 서비스의 생명이니까요!)
 

반응형
Comments