package main import ( "flag" "log/slog" "os" "git/palnet/slack-notifier/internal/config" "git/palnet/slack-notifier/internal/logging" "git/palnet/slack-notifier/internal/mapping" "git/palnet/slack-notifier/internal/notion" "git/palnet/slack-notifier/internal/server" "git/palnet/slack-notifier/internal/slack" ) func main() { // 실행 환경은 명령어 플래그로 분기한다 (예: `slack-notifier -env prod`). // 미지정 시 APP_ENV 환경변수 → 그래도 없으면 dev. envFlag := flag.String("env", "", "실행 환경: dev | prod") flag.Parse() cfg := config.Load(*envFlag) // Slack 클라이언트를 먼저 만들어 로깅에 주입한다 — Error 로그를 모니터 채널로 알리기 위함. slackClient := slack.New(cfg.SlackBotToken) logging.Setup(cfg, slackClient) store, err := mapping.New(cfg.MappingFile) if err != nil { slog.Error("failed to load mapping store", "file", cfg.MappingFile, "err", err) os.Exit(1) } notionClient := notion.New(cfg.NotionAPIToken, cfg.NotionAssigneeProperty) srv := server.New(cfg, slackClient, store, notionClient) slog.Info("slack-notifier starting", "addr", cfg.Addr, "log_level", cfg.LogLevel, "log_format", cfg.LogFormat) if err := srv.Router().Run(cfg.Addr); err != nil { slog.Error("server stopped", "err", err) os.Exit(1) } }