お疲れ様です。ラビンです。
discordを使用した出退勤アプリをpythonで作成しているのですが、前までfrontend=javascript,backend=pythonというような使用する言語でフロントエンドかバックエンドがわかる。
という認識がありました。
起きた問題
webアプリケーションを作った時,javascriptはフロントエンドフォルダ、pythonはバックエンドフォルダに分けていましたが、今回作成したdiscordアプリはpythonで全て作成したため、モジュールを1つのフォルダにしました。
その結果、私のコードはBot(フロントエンド)がAPI(バックエンド)のファイルを直接読み込む形になっていました。
# Botのコード
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import schemas # APIのファイル
どちらもPythonなので、ファイルを読み込めば簡単に使えてしまいます。
しかし、これではAPI(バックエンド)のコードを変更するとBot(フロントエンド)も壊れる可能性がある状態でした。
そんな中、ある程度実装と設計をしていく上で、3層アーキテクチャという言葉があり、フロントエンドとバックエンドは使用する言語ではなく、役割で分かれているということを知りました。
そもそも「アーキテクチャ」とは何なのか、自分のアプリを例にまとめてみます。
アーキテクチャとは
アーキテクチャは、もともと「建築」や「建物の設計」という意味の言葉です。
ソフトウェアでは、システム全体の組み立て方のことを指します。
もう少し抽象的に言うと「全体像」と私は理解するようにしてます。
家を建てるときに、いきなり壁を作り始めることはありません。先に「間取り」を決めます。
- 部屋をいくつに分けるか:(フロントエンド、バックエンド、データベース)
- それぞれの部屋を何に使うか:(フロントエンドはユーザーとやりとりする部分、バックエンドはリクエストを受けて処理する部分、データベースはデータを保存する部分)
- 部屋同士をどうつなぐか:(フロントエンドとバックエンドはHTTP通信でつなぐ。例えばフロントエンドで
/registerコマンドを実行すると、HTTP通信でバックエンドにリクエストが送られ、バックエンドがデータベースに名前を保存する)
ソフトウェアのアーキテクチャも同じで、次のことを決めます。
- システムを、どんな部品に分けるか
- それぞれの部品の役割は何か
- 部品同士が、どうやってやりとりするか
3層アーキテクチャとは
よく使われるアーキテクチャの1つが3層アーキテクチャです。
システムを「ユーザーとやりとりする層」「処理する層」「データを保存する層」の3つに分けます。
私のアプリに当てはめると、次のようになります。
| 層 | 役割 | 私のアプリ |
|---|---|---|
| プレゼンテーション層 | ユーザーとやりとりする | Discord Bot(discord.py) |
| アプリケーション層 | ルールに従って処理する | API(FastAPI) |
| データ層 | データを保存する | MySQL |
ユーザー → Discord Bot → API → MySQL
私のアプリはすべてPythonで書いていますが、同じPythonでも、Botはフロントエンド、APIはバックエンドという役割を持っていたことになります。
フロントエンドとバックエンドを分けるのは言語ではなく、アーキテクチャの中での役割だということです。
解決方法
「起きた問題」で紹介したコードは、Bot(プレゼンテーション層)がAPI(アプリケーション層)のファイルを直接読み込んでいる状態でした。
言語が同じだからこそ、層の境目があいまいになっていたのだと思います。
そこで、BotとAPIのフォルダを分け、BotとAPIはHTTP通信だけでつなげるように修正します。
まとめ
- アーキテクチャとは、システム全体の組み立て方(間取り)のこと
- フロントエンドとバックエンドは、言語ではなく役割で分かれる
- 同じ言語で書いていても、層の境目を意識しないと役割が混ざってしまう