Skip to content

[REFACTOR] Mattermost formatter 추출 및 Webhook sender transport 분리#96

Open
minyongP wants to merge 1 commit into
refactor/89-webhook-http-client-splitfrom
refactor/90-webhook-formatter-transport
Open

[REFACTOR] Mattermost formatter 추출 및 Webhook sender transport 분리#96
minyongP wants to merge 1 commit into
refactor/89-webhook-http-client-splitfrom
refactor/90-webhook-formatter-transport

Conversation

@minyongP

@minyongP minyongP commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

이번 PR의 중점

  • RestTemplateWebhookSender 하나에 섞여 있던 템플릿 렌더링, Mattermost payload 생성, HTTP transport 책임을 분리했습니다.
  • 벤더 확장성을 위해 과한 registry/selector를 먼저 넣지 않고, 현재 요구에 맞는 최소 경계(TemplatedWebhookSenderMattermostWebhookSenderRestTemplateWebhookTransport)만 도입했습니다.
  • 템플릿 변경 테스트와 전송 테스트의 경계를 나눠 이후 벤더 추가나 문구 변경 시 영향 범위를 줄였습니다.

관련 작업 / 이슈


내용 요약 (Description)

  • RestTemplateWebhookSender를 제거하고 책임을 다음과 같이 분리했습니다.
    • WebhookAlertTemplateRenderer: 공용 알림 문구 렌더링
    • RenderedWebhookMessage: 렌더링 결과를 전달하는 내부 DTO
    • TemplatedWebhookSender: application port 구현체로서 렌더링 후 Mattermost sender에 위임
    • MattermostWebhookSender: Mattermost payload 생성 및 직렬화
    • RestTemplateWebhookTransport: HTTP POST 전송 전담
  • 외부용 sender 인터페이스는 제거하고 concrete class 기반으로 단순화했습니다. 현재 벤더가 Mattermost 하나뿐인 상황에서 불필요한 추상화를 줄이기 위함입니다.
  • 기존 sender 테스트를 template / vendor sender / transport 테스트로 재구성했습니다.

클래스 다이어그램

classDiagram
    class WebhookAlertService {
      +deliver(...)
    }

    class WebhookSender {
      <<interface>>
      +send(hookUrl, message)
    }

    class TemplatedWebhookSender {
      -WebhookAlertTemplateRenderer templateRenderer
      -MattermostWebhookSender mattermostWebhookSender
      +send(hookUrl, message)
    }

    class WebhookAlertTemplateRenderer {
      +render(message)
    }

    class RenderedWebhookMessage {
      +title
      +body
      +footer
      +problemLink
      +deadline
      +scheduledAt
    }

    class MattermostWebhookSender {
      -RestTemplateWebhookTransport transport
      -ObjectMapper objectMapper
      +send(hookUrl, renderedMessage)
    }

    class MattermostWebhookPayload {
      +attachments
      +workspaceProblemId
      +workspaceId
      +workspaceName
      +problemTitle
      +deadline
      +scheduledAt
      +problemLink
    }

    class RestTemplateWebhookTransport {
      +sendJson(hookUrl, body)
    }

    class WebhookAlertMessage {
      +workspaceProblemId
      +workspaceId
      +workspaceName
      +problemTitle
      +deadline
      +scheduledAt
      +problemLink
    }

    WebhookAlertService --> WebhookSender
    WebhookSender <|.. TemplatedWebhookSender
    TemplatedWebhookSender --> WebhookAlertTemplateRenderer
    TemplatedWebhookSender --> MattermostWebhookSender
    WebhookAlertTemplateRenderer --> WebhookAlertMessage
    WebhookAlertTemplateRenderer --> RenderedWebhookMessage
    MattermostWebhookSender --> RenderedWebhookMessage
    MattermostWebhookSender --> MattermostWebhookPayload
    MattermostWebhookSender --> RestTemplateWebhookTransport
Loading

테스트

  • 테스트 시나리오 설명:
    • ./gradlew compileJava compileTestJava
    • ./gradlew test --tests 'com.ujax.application.webhook.WebhookAlertTemplateRendererTest' --tests 'com.ujax.infrastructure.external.webhook.TemplatedWebhookSenderTest' --tests 'com.ujax.infrastructure.external.webhook.MattermostWebhookSenderTest' --tests 'com.ujax.infrastructure.external.webhook.RestTemplateWebhookTransportTest' --tests 'com.ujax.application.webhook.WebhookAlertServiceTest'
  • 참고:
    • 로컬 pre-push hook의 ./gradlew verify --quiet 는 이 환경에서 :test 단계에서 완료되지 않아, 대상 테스트 재검증 후 --no-verify 로 push 했습니다.

PR 체크리스트

  • 관련 이슈(작업 항목)를 PR 설명에 연결했다.
  • ./gradlew verify 를 로컬에서 실행해 모두 통과함.
  • 불필요한 로그, 디버깅 코드, 주석을 제거했다.
  • 이 변경과 충돌할 수 있는 다른 PR이나 변경 사항이 없는지 확인했다.

Breaking Change 여부

  • Yes (호환성 깨짐 있음)
  • No

로그 / 스크린샷 (선택)

  • 클래스 다이어그램으로 구조 변화를 첨부했습니다.

기타 정보 / 의존성 (선택)

공용 템플릿 렌더링과 Mattermost 전송 책임을 분리하고 transport 계층을 분리한다.\n\nResolves : #90\nSee also : #88, #95
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

refactoring code refactoring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant