광고가 핵심 사용자 워크플로를 방해하지 않도록 하는 방법

발행: (2025년 12월 23일 오전 07:39 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

위의 Source 라인 아래에 번역하고 싶은 본문 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. (코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)

왜 이 문제가 중요한가

많은 모바일 애플리케이션에서 광고는 화면 배치나 타이밍 규칙에 따라 삽입되며, 사용자가 현재 무엇을 하고 있는지는 고려되지 않습니다. 엔지니어링 관점에서 이는 여러 문제를 야기합니다:

  • 광고의 타이밍이, 구체적인 광고 자체보다, 종종 사용자 경험을 방해합니다.
  • 핵심 사용자 워크플로우가 중단되어 좌절감과 참여도 감소를 초래할 수 있습니다.

실제 모바일 애플리케이션을 구축하면서, 문제는 어떤 광고가 표시되는지가 아니라 언제 표시되는지임을 발견했습니다. 이를 해결하기 위해 우리는 사용자의 상호작용 상태에 기반해 수익화를 런타임 결정으로 다루는 상호작용 인식 광고 억제 시스템을 구현했습니다. 이 글에서는 그 시스템의 엔지니어링 측면에 초점을 맞춥니다.

상호작용 이벤트 추적

첫 번째 단계는 로컬에서 의미 있는 상호작용 신호를 캡처하는 것입니다. 우리가 추적하는 이벤트 예시:

  • 화면 탭 및 스와이프
  • 폼 필드 포커스/블러
  • 내비게이션 전환
  • 인앱 구매 또는 기타 고가치 행동

개별 이벤트에 반응하기보다는 짧은 시간 창으로 묶어 시퀀스로 평가합니다. 이렇게 하면 노이즈에 과잉 반응하는 것을 방지하면서도 사용자의 의도를 포착할 수 있습니다.

상호작용 상태 도출

이 이벤트 시퀀스로부터 애플리케이션은 다음과 같은 소수의 상호작용 상태를 도출합니다:

  • Idle – 활성 사용자 입력 없음
  • Active Input – 사용자가 입력 중이거나 폼과 상호작용하고 있음
  • Critical Flow – 사용자가 결제 또는 온보딩 단계 중임
  • Background – 앱이 실행 중이지만 포그라운드에 있지 않음

각 상태마다 방해에 대한 허용도가 다릅니다. 예를 들어, Critical Flow 상태에서는 광고가 완전히 차단되는 반면, Idle 상태에서는 광고가 허용될 수 있습니다. 이는 의사결정 로직을 명시적이고 설명 가능하게 유지합니다.

기본 억제 로직

핵심 설계 결정은 기본적으로 광고를 억제하는 것이었습니다. 가능한 모든 “불량” 순간을 탐지하려고 시도하는 대신, 시스템은 현재 상호작용 상태에서 명시적으로 허용되지 않는 한 광고가 비활성화된 것으로 가정합니다. 이 접근 방식은 다음과 같습니다:

  • 고위험 순간에 광고가 절대 표시되지 않도록 보장합니다.
  • 중요한 워크플로우 중 불필요한 UI 재렌더링 및 네트워크 호출을 최소화합니다.
  • 결정 매트릭스를 단순화하여 감사 및 조정이 용이해집니다.

로컬 의사결정

모든 상호작용 상태 평가는 디바이스에서 이루어집니다. 클라이언트 애플리케이션은:

  1. 원시 상호작용 이벤트를 수집합니다.
  2. 경량 상태 머신을 사용해 이를 상태로 매핑합니다.
  3. 현재 상태를 기반으로 광고를 표시할 수 있는지 판단합니다.

원격 서비스가 사용되는 경우, 이는 구성(예: 상태 임계값) 제공에 한정되며 실시간 의사결정 경로의 일부가 아닙니다. 이를 통해 지연 시간, 신뢰성 및 네트워크 상태가 좋지 않을 때의 동작이 개선됩니다.

가벼운 피드백, 과도한 최적화가 아님

광고가 표시된 후(허용된 경우) 시스템은 다음과 같은 간단한 신호를 관찰합니다:

  • 즉각적인 사용자 거부
  • 클릭률
  • 세션 지속 지표

이러한 신호는 임계값을 점진적으로 조정하는 데 사용되며, 전달을 공격적으로 최적화하기 위해 사용되지 않습니다. 목표는 단기 수익을 극대화하기보다 안정성과 일관된 사용자 경험을 제공하는 것입니다.

실제로 잘 작동한 점

From an implementation standpoint, this approach resulted in:

  • Reduced interruptions during critical user flows. → 중요한 사용자 흐름 중 중단이 감소했습니다.
  • Higher user satisfaction scores measured in post‑release surveys. → 출시 후 설문조사에서 측정된 사용자 만족도 점수 상승을 확인했습니다.
  • Stable revenue that aligns with genuine user engagement rather than forced impressions. → 강제 노출이 아닌 실제 사용자 참여에 맞는 안정적인 수익을 달성했습니다.
  • Simpler codebase: the on‑device state machine is easy to test and maintain. → 코드베이스가 단순해졌으며, 디바이스 내 상태 머신은 테스트와 유지보수가 용이합니다.

Most importantly, the system aligned monetization behavior with actual user interaction patterns. → 가장 중요한 것은 시스템이 수익화 행동을 실제 사용자 상호작용 패턴에 맞추었다는 점입니다.

최종 생각

광고는 사용자 워크플로와 경쟁할 필요가 없습니다. 수익화를 순수히 수익‑중심 기능이 아니라 상호작용‑인식 엔지니어링 문제로 다룸으로써, 애플리케이션은 신뢰성이나 신뢰를 희생하지 않으면서 지속 가능성을 유지할 수 있습니다. 때때로 시스템이 내릴 수 있는 최선의 결정은 전혀 행동하지 않는 것입니다.

Back to Blog

관련 글

더 보기 »

SwiftUI 제스처 시스템 내부

!Sebastien Latohttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...