DEV-BBAK 블로그

Published on

프론트엔드 모니터링 회고

Authors
  • Name
    Twitter

결제 시스템은 서비스에서 가장 중요한 부분 중 하나입니다. 사용자가 결제를 진행할 때 문제가 발생하면 직접적인 매출 손실뿐만 아니라 신뢰도에도 큰 영향을 미칩니다. 최근 글로벌 확장을 대비하여 기존 PHP 기반의 모놀리식 결제 시스템을 Java Spring + Next.js 아키텍처로 마이그레이션하면서, AWS SQS 기반의 이벤트 드리븐 시스템을 도입했습니다. 하지만 새로운 아키텍처에서도 예측하지 못한 모니터링 문제들이 발생했습니다.

이 글에서는 결제 시스템의 모니터링을 개선하기 위해 어떤 시도를 했고, 어떤 문제를 해결했으며, 현재까지의 회고를 공유하려 합니다.

결제 모니터링의 핵심 도전 과제

새로운 결제 시스템을 운영하면서 직면한 문제들은 다음과 같았습니다.

  1. 이벤트 전파 실패 감지 어려움
  • AWS SQS를 통해 결제 이벤트를 처리했지만, 특정 시나리오에서 메시지가 정상적으로 발행되지 않는 문제가 발생함.
  • 일부 유저가 결제 완료 후에도 상태가 갱신되지 않는 사례가 보고됨.
  1. 프론트엔드에서 원인을 추적하기 어려움
  • API 요청이 정상적으로 전송되었지만, 백엔드에서 정상적으로 처리되지 않은 경우 클라이언트에서 이를 인지하기 어려움.
  • Datadog RUM과 DD Trace를 적용했지만, 사용자 플로우 전반을 한눈에 파악하기 어려웠음.
  1. Slack 알림을 통한 실시간 모니터링 부족
  • 문제 발생 시 빠르게 감지하고 대응하기 어려웠음.
  • 기존에는 오류 발생 시 Datadog을 통해 모니터링했지만, Slack을 활용한 실시간 추적이 필요했음.
  1. 유저의 비정상적인 행동과 엣지 케이스 대응 부족
  • 실제로 Slack 로그를 통해 유저가 결제 시도 후 빠르게 브라우저를 종료하면서 SQS 요청이 가지 않은 사례를 발견함.
  • 이로 인해 결제는 완료되었지만, 수강권 발급이 실패하는 문제가 발생함.
  • 이러한 엣지 케이스를 감지하고 대응할 수 있는 시스템이 필요했음.

개선을 위한 접근법

Slack 기반의 결제 흐름 추적 시스템 도입

결제 플로우를 더 명확하게 모니터링하기 위해 Slack Webhook을 활용한 결제 추적 시스템을 구축했습니다.

  • 프론트엔드에서 결제 요청을 보낼 때, 해당 데이터를 Slack으로 전송
  • SQS 이벤트 발행전 메시지 바디 데이터를 Slack으로 전송
  • SQS 이벤트 발행후 메시지의 상태를 Slack으로 전송
  • 이후 상황은 프론트엔드가 아닌 백엔드 개발자가 추적하여 문제 해결
  • 이를 통해 각 결제의 흐름을 한눈에 파악할 수 있도록 구성

결제 상태 로그 예시

{
  "userId" : 1234567890,
  "amount" : 500,
  "paymentMethodType":"KAKAO_PAY",
  "useragent" : 앱내 브라우저 or 웹에서 구매했는지, 혹은 외부 인앱 브라우저에서 구매했는지 등등
}

이 방식 덕분에 결제 요청이 프론트엔드 → 백엔드 → SQS → 최종 반영까지 정상적으로 처리되었는지 실시간으로 확인할 수 있게 되었습니다.

또한, 비정상적인 유저 행동(예: 결제 후 브라우저 종료)도 감지할 수 있도록 로깅을 강화했습니다. 이를 통해 특정 유저가 결제 요청 후 SQS 메시지를 보내지 못한 경우를 빠르게 파악할 수 있었습니다.

Datadog RUM과 DD Trace 개선

Datadog RUM과 DD Trace를 적용했지만, 처음에는 단순한 이벤트 로깅 수준이었습니다. 이를 개선하기 위해 다음과 같은 접근법을 시도했습니다.

  • 사용자 세션을 추적하여 특정 사용자와 관련된 결제 요청을 필터링 가능하도록 개선
  • 프론트엔드와 백엔드 로그를 하나의 트레이스로 연결하여 흐름을 쉽게 분석할 수 있도록 설정

UI 피드백과 로딩 인디케이터 개선

이벤트 드리븐 아키텍처를 사용하면서, 사용자에게 실시간으로 상태를 제공하는 것이 중요하다는 점을 깨달았습니다. 이를 위해 다음과 같은 접근법을 시도했습니다.

  • 결제 요청 후 즉시 낙관적 업데이트를 적용하지 않고, 이벤트가 정상적으로 처리될 때까지 로딩 인디케이터 제공
  • SQS 메시지가 일정 시간 내에 수신되지 않으면 오류 메시지를 표시하고, 재시도 버튼 제공
  • 사용자 인터페이스에서 결제 진행 상태를 명확하게 보여줄 수 있도록 Splash 화면 적용
  • 숏폴링(short polling) 기법을 활용하여 일정 주기마다 결제 상태를 확인하고, 사용자가 페이지를 새로고침하지 않아도 결과를 즉시 알 수 있도록 개선

이 방식 덕분에, 유저가 결제 버튼을 여러 번 클릭하는 문제를 방지하고, 신뢰할 수 있는 결제 경험을 제공할 수 있었습니다.

결제 시스템의 현재 상태

이벤트 드리븐 아키텍처를 사용하면서 결제 시스템의 현재 상태는 다음과 같습니다.

  • 결제 요청 후 즉시 낙관적 업데이트를 적용하지 않고, 이벤트가 정상적으로 처리될 때까지 로딩 인디케이터 제공
  • 숏폴링(short polling) 기법을 활용하여 일정 주기마다 결제 상태를 확인하고, 사용자가 페이지를 새로고침하지 않아도 결과를 즉시 알 수 있도록 개선
  • 결제 요청 후 즉시 낙관적 업데이트를 적용하지 않고, 이벤트가 정상적으로 처리될 때까지 로딩 인디케이터 제공
  • 숏폴링(short polling) 기법을 활용하여 일정 주기마다 결제 상태를 확인하고, 사용자가 페이지를 새로고침하지 않아도 결과를 즉시 알 수 있도록 개선

결론과 앞으로의 방향

이번 프론트엔드 모니터링 작업을 통해 얻은 교훈은 다음과 같습니다.

  • 실시간 모니터링이 중요하다: 결제 흐름을 추적할 수 있는 Slack 알림 시스템을 도입하면서 문제를 빠르게 인지할 수 있었음.
  • 엔드투엔드 추적이 필요하다: Datadog RUM과 DD Trace를 개선하여 결제 요청부터 최종 처리까지 한눈에 볼 수 있도록 구성함.
  • 사용자 피드백을 강화해야 한다: UI에서 결제 진행 상태를 명확하게 제공하여 사용자 불편을 최소화함.

앞으로는 AI 기반 이상 감지 시스템을 도입하여 비정상적인 결제 패턴을 자동 감지하고, 보다 정교한 모니터링 체계를 구축해볼 계획입니다. 또한, 프론트엔드에서 A/B 테스트를 적용하여 최적의 결제 UI를 찾아가는 과정도 추가로 진행할 예정입니다.

프론트엔드에서의 모니터링은 단순한 에러 로깅을 넘어 사용자 경험을 개선하는 핵심 요소라는 점을 다시 한번 깨닫게 된 경험이었습니다. 앞으로도 더 나은 모니터링 환경을 고민해 나가겠습니다.