Skip to content

[feature] 비즈니스 이벤트 로깅 기반 구축 - #161

Merged
gihhyeon merged 4 commits into
developfrom
feat/160-analytics-event-logging
Sep 9, 2026
Merged

gihhyeon merged 4 commits into
developfrom
feat/160-analytics-event-logging

Conversation

@gihhyeon

@gihhyeon gihhyeon commented Sep 9, 2026

Copy link
Copy Markdown
Member

요약

백엔드에 이벤트 로그를 수집하는 기반이 없어, 비즈니스 이벤트를 event_log에 적재하는 구조를 마련한다. (MVP)

What — 무엇을 바꿨나

  • common/analytics 패키지 신설
    • EventType/TargetType(enum), EventLog(BaseEntity 상속), AnalyticsEvent(record)
    • AnalyticsRecorder(발행 헬퍼), AnalyticsEventListener(비동기 AFTER_COMMIT 적재)
    • EventLogRepository, JsonMapConverter(properties JSON ↔ Map)
  • 계측 지점 연결
    • SIGNUP/LOGIN: AuthService.login (firstLogin 분기)
    • PLACE_REGISTER_REQUESTED: PlaceService.register
    • PLACE_APPROVED/PLACE_REJECTED: AdminPlaceRegisterRequestService.review
    • EVENT_ENTERED: RequestReviewEventListener (자동 응모 성공 시)
  • 테스트: JSON 컨버터, 리스너 적재/매핑, 커밋·롤백(AFTER_COMMIT) 통합 검증
  • src/main/resources/sql/event_log.sql: prod 수동 DDL + 검증 쿼리

Why — 왜 필요한가

  • 지금 백엔드는 유저·비즈니스 행동에 대한 이벤트 로그를 전혀 수집하지 않는다. 그래서 이벤트 효과나
    퍼널 같은 걸 볼 때마다 created_at으로 매번 사후에 재구성해야 했다.
  • 프론트의 GA4는 자동수집만 설정돼 있어 액션 전환·회원 리텐션(user_id)을 못 보고, 구글에 있는
    데이터라 운영 DB와 조인도 안 된다.
  • 우선 GA가 못 보는 비즈니스 이벤트부터 서버에서 남겨, 앞으로 확장해 나갈 수집 기반을 마련한다.

How — 어떻게 구현했나

  • 기존 ApplicationEvent + @Async @TransactionalEventListener(AFTER_COMMIT) 패턴 재사용.
    도메인은 AnalyticsRecorder로 이벤트만 발행하고 analytics에 의존하지 않는다.
  • fire-and-forget: 리스너는 별도 스레드에서 적재하고 예외를 흡수해, 로깅 실패·지연이 비즈니스
    트랜잭션에 영향을 주지 않는다. AFTER_COMMIT이라 롤백된 액션은 남지 않는다.
  • fallbackExecution = true로, 트랜잭션 밖에서 발행되는 이벤트(자동 응모 등)도 적재한다.
  • properties(JSON 컬럼 + 컨버터)와 anonymous_id 컬럼을 미리 두어, 스키마 변경 없이 속성
    추가나 익명 추적 연동으로 확장할 수 있게 했다. MVP에선 대부분 비워둔다.

체크리스트

  • 불필요한 주석/코드 제거
  • 테스트 추가/갱신 및 통과 (./gradlew test)
  • 공개 계약 영향 확인 (엔드포인트·응답 형태 변경 없음 — 내부 계측만 추가)

관련 이슈

기타 / 리뷰 포인트

  • ⚠️ prod 배포 전 필수: prod는 ddl-auto: validateevent_log 테이블을 먼저 수동 생성해야
    기동에 성공한다. DDL은 src/main/resources/sql/event_log.sql 참고.
  • MVP 범위(비즈니스 라이프사이클 + 로그인/가입)만 포함. 좋아요/검색 등 고빈도 액션 이벤트는 다음 단계로.

- common/analytics: EventType/TargetType, EventLog(BaseEntity), AnalyticsEvent(record),
  AnalyticsRecorder(발행 헬퍼), AnalyticsEventListener(비동기 AFTER_COMMIT 적재),
  EventLogRepository, properties JSON 컨버터
- 기존 ApplicationEvent + @async @TransactionalEventListener 패턴 재사용
- fire-and-forget: 적재 실패가 비즈니스 트랜잭션에 영향 없음
- JSON 컨버터 직렬화/역직렬화
- 리스너 적재·필드 매핑·properties 왕복
- 커밋 시 적재 / 롤백 시 미적재(AFTER_COMMIT) 통합 검증
- prod(validate) 배포 전 수동 생성용 CREATE TABLE
- DAU/신규가입/코호트 리텐션/등록→승인→응모 퍼널 집계 쿼리
@gihhyeon gihhyeon self-assigned this Sep 9, 2026
@gihhyeon gihhyeon added the ✨ Feature 기능 개발 label Sep 9, 2026
@gihhyeon
gihhyeon merged commit 5eac05b into develop Sep 9, 2026
2 checks passed
@gihhyeon
gihhyeon deleted the feat/160-analytics-event-logging branch September 15, 2026 04:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] 비즈니스 이벤트 로깅 기반 구축

1 participant