Edited at

Kotlin でオレオレフレームワークを作ってみる ~03 - フレームワークの仕様を考える~


はじめに

今回は Ougi の仕様を考えていきましょう(・∀・)。

※注意!

この一連の記事で紹介するコードは動作の概念を説明するものでありセキュリティーなどは意識していません(・∀・)。

実際に運用するシステムなどに使用しないでください(・∀・)。

(そのまま使うひともいないと思いますが)


一覧


フレームワークの設計方針


全体

今回のフレームワークは簡単な仕様にします(・∀・)。

が、あまりに簡単なものにしてしまうと作ってみても面白くないと思いますので


  • ルーティング

  • コントローラー

  • HTMLテンプレート

  • ORマッパー

  • マイグレーション

あたりはサポートします(・∀・)。

まずは簡単な MVC な構成を考えて機能を追加していこうと思います(・∀・)。

ただ、よく議題に上がる「ビジネスロジックがコントローラ任せになる」問題については考えません(・∀・)。

作成するフレームワークは 何でもかんでもコントローラに書く と言うスタイルのウェブフレームワークの実装になります(・∀・)。

何故なら その方がフレームワークの実装が簡単 だからです(・∀・)w


  • 組み込みウェブサーバー

については大雑把なものは前章で実装済みだと思いますので、これを拡張していく方向で考えます(・∀・)。

また、上記の機能軍は基本的に ミドルウェアパターン にて実装を考えています(・∀・)。

ミドルウェアとして各機能を提供するので、使いたい機能だけ使ったり一部だけ機能を入れ替えたり出来る 仕組みを提供します(・∀・)。

ちょっと楽しそうじゃありませんか(・∀・)?


ルーティング

ルーティングは、特定の URL アクセスが有った場合に所定のコントローラを呼び出す機能です(・∀・)。

ウェブアプリケーションフレームワークでこの機能を実装していないものはないと言えるくらい重要な機能です(・∀・)。

通常のウェブサーバーは実際のファイルシステムに置かれたファイル・ディレクトリ構造に合わせた URL アクセスになりますが、ウェブアプリケーションの場合はもっと自由なアクセス方法が求められるので、フレームワークとしては必須の機能と言えるでしょう(・∀・)。

今回は URL アクセスに応じて、後述するコントローラを呼び出す仕様を初回実装とします(・∀・)。


コントローラ

アクセスされた URL 毎にコントローラを実装します(・∀・)。

例えば


http://localhost/maosec


とアクセスした時に Maosec クラスの処理を呼び出すみたいな実装を考えていきます(・∀・)。


HTMLテンプレート

ウェブフレームワークはHTMLを動的に生成してブラウザに返します(・∀・)。

「動的に生成して」というのは、フレームワークがプログラムの中(コントローラなどの処理の中)で HTML に相当する文字列(String)を作成してブラウザに返します(・∀・)。

前章のウェブサーバー開発で返す文字列を返す処理をしましたね(・∀・)。

output.write("HTTP/1.1 200 OK\r\n".toByteArray())

// HTTPレスポンス
output.write("Date: $datetime\r\n".toByteArray())
output.write("Content-Length: $size\r\n".toByteArray())
output.write("Content-Type: text/html\r\n".toByteArray())
output.write("\r\n".toByteArray())

// 読み込んだファイル内容をボディに書き込む
output.write(html)

のようにするだけです(・∀・)。

が、

val html = "<html><head> ... </head><body> ... </body></html>"

のように HTML を作るのは面倒くさいですね(・∀・)。

少なくとも私は嫌です(・∀・)w

なのでこれをもっとスマートに書ける機能を提供します(・∀・)。


ORマッパーとマイグレーション

あんま書いてもしょうがないのでこれは後々の章で書きます(・∀・)w


次回

次回はルーティングとコントローラを実装します(・∀・)。

こんな記事を読んでいる人は少ないでしょうか、数少ない読者もコードを見たいでしょうから(・∀・)w