notifier

package
v1.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 18, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	// ErrQueueFull 일시적인 트래픽 폭주로 내부 대기열이 가득 차서, 요청을 즉시 처리할 수 없을 때 반환됩니다.
	ErrQueueFull = apperrors.New(apperrors.Unavailable, "현재 알림 발송 대기열이 가득 차서 요청을 처리할 수 없습니다. 잠시 후 다시 시도해 주세요")

	// ErrClosed 서비스가 종료 절차를 진행 중이거나 이미 중단되어, 더 이상 요청을 수락할 수 없는 상태입니다.
	ErrClosed = apperrors.New(apperrors.Unavailable, "알림 발송 서비스가 종료되었기 때문에 새로운 요청을 수락할 수 없습니다")

	// ErrPanicRecovered 로직 수행 중 치명적인 런타임 패닉이 발생했으나, 시스템 보호를 위해 안전하게 복구되었습니다.
	ErrPanicRecovered = apperrors.New(apperrors.Internal, "내부 시스템 로직 수행 중 심각한 오류가 발생하여 안전하게 복구되었습니다")
)

Functions

This section is empty.

Types

type Base

type Base struct {
	// contains filtered or unexported fields
}

Base 모든 Notifier 구현체가 공통적으로 상속(임베딩)받아 사용하는 기본 구조체입니다.

구체적인 Notifier 구현체(예: telegramNotifier)는 이 Base를 필드로 포함함으로써, "알림을 큐에 넣고 관리하는 책임"을 Base에 위임하고, "실제로 외부 API를 호출하는 책임"에만 집중할 수 있습니다.

func NewBase

func NewBase(id contract.NotifierID, supportsHTML bool, bufferSize int, enqueueTimeout time.Duration) *Base

NewBase 새로운 Base Notifier 인스턴스를 생성하고 초기화합니다.

func (*Base) Close

func (b *Base) Close()

Close Notifier의 운영을 중단하고 관련 리소스를 정리합니다.

이 메서드가 호출되면:

  1. Notifier의 상태가 '종료됨(Closed)'으로 변경되어 더 이상의 새로운 Notify 요청을 받지 않습니다.
  2. Done 채널이 닫혀서, 이를 구독하고 있는 모든 고루틴(Sender, Receiver 등)에게 종료 신호를 전파합니다.

참고: 내부 메시지 채널(notificationC)은 명시적으로 닫지 않습니다. 이는 다중 프로듀서(Multi-Producer) 환경에서 채널 닫기에 의한 패닉을 방지하기 위함이며, 남은 메시지는 GC에 의해 수거되거나 Drain 로직에 의해 처리됩니다.

func (*Base) Done

func (b *Base) Done() <-chan struct{}

Done Notifier의 종료 상태를 감지할 수 있는 읽기 전용 채널을 반환합니다.

반환된 채널이 닫혔다면, 해당 Notifier가 Close() 호출에 의해 종료되었음을 의미합니다. 주로 Select 구문 내에서 종료 시그널을 감지하여 고루틴을 안전하게 정리(Graceful Shutdown)하는 데 사용됩니다.

func (*Base) ID

func (b *Base) ID() contract.NotifierID

ID Notifier 인스턴스의 고유 식별자(ID)를 반환합니다.

func (*Base) NotificationC

func (b *Base) NotificationC() <-chan *notificationRequest

NotificationC Notifier 내부에서 관리하는 '알림 요청 채널(읽기 전용)'을 반환합니다.

이 채널은 '발송자(Sender)'가 메시지를 하나씩 꺼내어 처리하기 위한 용도입니다. 외부에서는 오직 '읽기(<-chan)'만 가능하므로, 임의로 채널을 닫거나 데이터를 보낼 수 없습니다.

func (*Base) Send

func (b *Base) Send(ctx context.Context, notification contract.Notification) (err error)

Send 알림 발송 요청을 내부 큐(채널)에 안전하게 등록합니다.

이 메서드는 실제 발송을 수행하지 않고, 요청을 메모리 큐에 넣는 역할만 수행하므로 매우 빠르게 리턴됩니다. 큐가 가득 찬 경우, 설정된 타임아웃(enqueueTimeout)만큼 대기합니다.

파라미터:

  • ctx: 요청의 생명주기를 관리하는 컨텍스트
  • notification: 전송할 알림 데이터

반환값:

  • error: 성공 시 nil, 실패 시 에러 반환 (ErrQueueFull, ErrClosed 등)

func (*Base) SupportsHTML

func (b *Base) SupportsHTML() bool

SupportsHTML 알림 채널이 HTML 스타일의 메시지 포맷팅을 지원하는지 여부를 반환합니다. true인 경우, 메시지 내용에 <b>, <i>, <a href="..."> 등의 태그를 사용할 수 있습니다.

func (*Base) TrySend

func (b *Base) TrySend(ctx context.Context, notification contract.Notification) (err error)

TrySend 알림 발송 요청을 내부 큐(채널)에 등록 시도합니다.

Send와 달리, 큐가 가득 찼을 때 대기(Block)하지 않고 즉시 에러(ErrQueueFull)를 반환합니다. 빠른 응답이 중요하거나, 알림 유실이 허용되는 경우(예: 시스템 점유 상태 알림)에 사용합니다.

파라미터:

  • ctx: 요청의 생명주기를 관리하는 컨텍스트
  • notification: 전송할 알림 데이터

반환값:

  • error: 성공 시 nil, 큐가 가득 찬 경우 즉시 ErrQueueFull 에러를 반환합니다.

func (*Base) WaitForPendingSends

func (b *Base) WaitForPendingSends()

WaitForPendingSends 현재 진행 중인 모든 Send() 및 TrySend() 요청이 완료될 때까지 블로킹 대기합니다.

이 메서드는 Graceful Shutdown 시 메시지 유실을 방지하기 위해 워커(Consumer) 고루틴이 종료 직전에 호출합니다. Close()가 호출된 시점에 이미 sendInternal()에 진입한 고루틴들이 채널에 메시지를 전송할 기회를 보장하여, "채널 확인(Empty) → 종료 → Send(Push)" 순서로 발생하는 Race Condition을 방지합니다.

type Creator

type Creator interface {
	CreateAll(appConfig *config.AppConfig, executor contract.TaskExecutor) ([]Notifier, error)
}

Creator Notifier 목록을 생성하는 역할을 정의한 인터페이스입니다.

type CreatorFunc

type CreatorFunc func(appConfig *config.AppConfig, executor contract.TaskExecutor) ([]Notifier, error)

CreatorFunc 설정 정보를 바탕으로 Notifier 목록을 생성하는 함수 타입입니다.

func (CreatorFunc) CreateAll

func (f CreatorFunc) CreateAll(appConfig *config.AppConfig, executor contract.TaskExecutor) ([]Notifier, error)

CreateAll 함수 f를 호출하여 Notifier 생성을 위임합니다.

type Factory

type Factory interface {
	Creator

	Register(creator Creator)
}

Factory Notifier 생성을 담당하는 팩토리 인터페이스입니다.

Example
package main

import (
	"fmt"

	"github.com/darkkaiser/notify-server/internal/config"
	"github.com/darkkaiser/notify-server/internal/service/contract"
	"github.com/darkkaiser/notify-server/internal/service/notification/notifier"
)

func main() {
	// 1. Factory 생성
	f := notifier.NewFactory()

	// 2. Creator 등록 (앱 초기화 단계)
	f.Register(notifier.CreatorFunc(func(cfg *config.AppConfig, executor contract.TaskExecutor) ([]notifier.Notifier, error) {
		// 설정(cfg)을 기반으로 Notifier 생성 로직 구현
		fmt.Println("Initializing specific notifier...")
		return []notifier.Notifier{}, nil
	}))

	// 3. 일괄 생성 (서비스 시작 단계)
	notifiers, _ := f.CreateAll(&config.AppConfig{}, nil)

	fmt.Printf("Total notifiers: %d\n", len(notifiers))

}
Output:
Initializing specific notifier...
Total notifiers: 0

func NewFactory

func NewFactory() Factory

NewFactory 새로운 Factory 인스턴스를 생성합니다.

type Notifier

type Notifier interface {
	// ID Notifier 인스턴스의 고유 식별자(ID)를 반환합니다.
	ID() contract.NotifierID

	// Run 알림 발송을 처리하는 백그라운드 워커(Consumer)를 실행합니다.
	// 이 메서드는 블로킹(Blocking)되며, 큐에 쌓인 알림 요청을 하나씩 꺼내어 실제로 전송하는 역할을 합니다.
	// Context가 취소되거나 내부에서 치명적인 에러가 발생하여 종료될 때까지 실행됩니다.
	Run(ctx context.Context)

	// Send 알림 발송 요청을 내부 큐(채널)에 안전하게 등록합니다.
	//
	// 이 메서드는 실제 발송을 수행하지 않고, 요청을 메모리 큐에 넣는 역할만 수행하므로 매우 빠르게 리턴됩니다.
	// 큐가 가득 찬 경우, 설정된 타임아웃(enqueueTimeout)만큼 대기합니다.
	//
	// 파라미터:
	//   - ctx: 요청의 생명주기를 관리하는 컨텍스트
	//   - notification: 전송할 알림 데이터
	//
	// 반환값:
	//   - error: 성공 시 nil, 실패 시 에러 반환 (ErrQueueFull, ErrClosed 등)
	Send(ctx context.Context, notification contract.Notification) error

	// TrySend 알림 발송 요청을 내부 큐(채널)에 등록 시도합니다.
	//
	// Send와 달리, 큐가 가득 찼을 때 대기(Block)하지 않고 즉시 에러(ErrQueueFull)를 반환합니다.
	// 빠른 응답이 중요하거나, 알림 유실이 허용되는 경우(예: 시스템 점유 상태 알림)에 사용합니다.
	//
	// 파라미터:
	//   - ctx: 요청의 생명주기를 관리하는 컨텍스트
	//   - notification: 전송할 알림 데이터
	//
	// 반환값:
	//   - error: 성공 시 nil, 큐가 가득 찬 경우 즉시 ErrQueueFull 에러를 반환합니다.
	TrySend(ctx context.Context, notification contract.Notification) error

	// Close Notifier의 운영을 중단하고 관련 리소스를 정리합니다.
	//
	// 이 메서드가 호출되면:
	//  1. Notifier의 상태가 '종료됨(Closed)'으로 변경되어 더 이상의 새로운 Notify 요청을 받지 않습니다.
	//  2. Done 채널이 닫혀서, 이를 구독하고 있는 모든 고루틴(Sender, Receiver 등)에게 종료 신호를 전파합니다.
	//
	// 참고: 내부 메시지 채널(notificationC)은 명시적으로 닫지 않습니다. 이는 다중 프로듀서(Multi-Producer) 환경에서
	// 채널 닫기에 의한 패닉을 방지하기 위함이며, 남은 메시지는 GC에 의해 수거되거나 Drain 로직에 의해 처리됩니다.
	Close()

	// Done Notifier의 종료 상태를 감지할 수 있는 읽기 전용 채널을 반환합니다.
	//
	// 반환된 채널이 닫혔다면, 해당 Notifier가 Close() 호출에 의해 종료되었음을 의미합니다.
	// 주로 Select 구문 내에서 종료 시그널을 감지하여 고루틴을 안전하게 정리(Graceful Shutdown)하는 데 사용됩니다.
	Done() <-chan struct{}

	// SupportsHTML 알림 채널이 HTML 스타일의 메시지 포맷팅을 지원하는지 여부를 반환합니다.
	// true인 경우, 메시지 내용에 <b>, <i>, <a href="..."> 등의 태그를 사용할 수 있습니다.
	SupportsHTML() bool
}

Notifier 다양한 알림 채널(예: 텔레그램, 슬랙 등)을 추상화한 인터페이스입니다.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL