はじめに
前回の TodoBot作成|01 Azure SQL DB では、Azure SQL DBの作成を進めたかったのでいきなりSQLの話から入ってしまいました。が、本来ならば、まずはどんなアプリケーションをつくろうとしてるのかの説明が必要だなと立ち返ったので、この記事で説明していきます。
ただまぁ、別に何か特別なものをつくろうとしているわけではないです。つくりたいのはシンプルなTodo管理Botです。なので、このTodoBot作成シリーズは、「これからDiscordのBotをつくってみようかな」「Azureって触ったことないけど、どんなことを考えながら構築していくの?」なんて考えている人向けの記事になるかなと思います。
ちなみに今回の記事では、つくりたいアプリケーションのことしか書いていないので、Azureの話にはほぼ触れてません。Azureまわりの話はまた次回。
つくりたいもの|要求
さて、前述したとおりつくりたいものはごくシンプル。Discord上でTodo管理できるBotです。どうしてそんなものをつくろうと思ったかというと……
最近、ゲームで遊ぶときによくDiscordを利用するようになりました。遊ぶ単位やゲームでチャンネルを分けて、ゲームの内容についてテキストでチャットしたり、実際にゲームをするときはボイスチャンネルを使って音声でやりとりしたり。便利ですよね。
で、そうやって遊んでると、チャンネルごとでちょこちょこと「やること」が出てきます。「次に集まって遊べる日はいつか日程調整しなきゃ」だとか、「ゲームのための場を用意しなきゃ」だとかね。
それが1つや2つであれば問題はないんですが、数が10や20になってくるとどこかに書いておかないと忘れてしまう。さらには、自分がやるべきことだけじゃなくて、他の人にも期日までにやってほしいことが出てきたりなんかすると、管理がたいへん。
……なら、チャンネルごとにBotでTodo管理できるとステキじゃない? というのが、ことの発端。
ざっとDiscordの既存Botをさらってみたんですが、いまいちこの要求にハマるものがなかったので、自分でつくることにしました。今までBotというものをちゃんとつくってみたことがなかったので、つくってみたかっというのもあります。
(もし「このTodo管理Botいいよ!」というものがあったら教えてください。喜びます。)
今回の目標|ゴール
もちろん「Todo管理Botをつくりあげる」というのが一番の目標になりますが、記事を書いていくにあたりもう一つ目標を定めました。それは「Azureの知識を深める、整理する、アウトプットしてみる」というものです。
正直、個人で利用するDiscordのBotつくるくらいならAzure使う必要無いんですよね。全然。高いし。その分高機能だけど、そこまでいーらないって感じ。ではあるんですけど……。
今まで業務でAzureを触ってみたことはあったものの、おおよそ開発はチームで行うこともあって、一から十まで通して触ったことがなかったんです。幸い、今回つくりたいアプリケーションはすごくシンプルなものだし、手を広げすぎて収集がつかなくなるということもなさそう。なので、欲しいものをつくりつつ、今のAzureについてもアプリケーションの構築からデプロイ、リリースまで全部総ざらいして記事にしちゃおうかと思い立ちました。
というわけで、全体の目標としては「Azureを利用して、Discordで利用できる自分好みでシンプルなTodo管理Botをつくりあげる」となりました。
アプリケーションの要件・設計
要件と書くとちょっと形式ばった感じになりますが、とりあえず自分がどんなものをつくりたいのか、どんなものがつくれたら「できた」といえるのか、どうやったらつくっていけそうか、ということを整理・設計しました。その時の流れと作成物をざっと載せておきます。
ユースケース
こういうことがしたいな、というのをDiscordチャンネル管理者視点に絞ってユースケース図に書き出す。

USM
さっきのユースケースを全て一息につくりあげるというのはなかなか困難なので、ユーザーストーリーマッピング(USM)という手法を使って、どういうときに必要なものか? 優先順位は? ほかに必要なものはないか? を洗い出す。

まずはチャンネルのタスク管理ができないと話にならないので「タスクとしてやるべきことを登録する」「リスト内のタスクを一覧で見る」「タスクのステータスをDone」を第一フェーズとしました。これは「チャンネルのタスク管理」というストーリーを実現するためのタスク群ですね。
とりあえず、この第一フェーズが実現できれば、Todo管理Botとしての存在意義はありそうです。まずはここを目指して進めていきます。
データモデリング
DB設計というものをまともにやったことが無かったので、「実践的データモデリング入門」という本を参考に、軽くデータモデリングを行いました。
まずは業務フローの整理。

エンティティはこんな感じになりそうかな。物/設備に「リスト」と「タスク」を入れるべきか悩みましたが……うーん。まあ、大体あってるでしょう。
- 人/組織
- Discordユーザー
- タスク管理者:タスクの実施を計画する人
- タスク担当者(実施者):期日までにタスクを実行する人
- Discordユーザー
- 取引先
- なし
- 物/設備
- Discordチャンネル:情報の通知先
- リスト:タスクをひとまとめにするもの
- タスク:やるべきことが記載されているもの
次に、エンティティ同士の関連を洗い出し。ここで、タスクをまとめるもの=リスト=チャンネル、という関係が見えてくる。

さらに、エンティティの属性を洗い出し。DiscordユーザーとDiscordチャンネルは、Discord側で管理されてるデータなのでこっちでは管理しません。よきにはからえ。

最後に、ちゃんとしたER図っぽく物理名を設定。後でデータがおかしくなったとき原因追及がきちんとできるように、作成・更新・ステータスのカラムも追加。

DBやアプリケーションでどんなものが必要かが明確になってきました。
アプリケーションの構成
どんなアプリケーションにするかが見えてきたので、必要そうなサービスを洗い出して構成図を作成。大体、はじめの想定通りです。良かった。

この後の流れ
まずは、構成図をもとにAzureを使って環境をつくっていく予定です。環境ができあがったら、DBを整備して、アプリケーションを実装。大体できてきたらDevOpsを使ってデプロイ環境を整えて、本格的にCI/CDを回していく……ってな感じです。ただし予定は予定なので、興味が別のところに移ったら別のことしてるかもしれません。あしからず。