はじめに
SpringBootを約1か月学習し、初学者のときはわかっていなかったポイントを
かなり、初学者目線で噛み砕いて整理。
習得者の方から見たら、何を当たり前のことを・・・。という内容かも。
そしてこれらは実務レベルではなく、学習レベルでのお話というところ。きっと実務はもっとややこしい。
自身の考えを言語化して、次のステップの注力するポイントを精査していくことが目的。
「Model」「View」「Controller」は役割の話
自分はRuby on Railsを少しやっていて、MVCモデルについて学習をしていた。
そのうえでのイメージ「Model」「View」「Controller」は役割の話であり
ファイル名の話ではないということ。
役割がわかりやすいように、
ファイル名に「ItemController」のようにつける場合などもあるからさらにややこしい。
Ruby on Railsの学習では、
Modelには「Model」という名前がついており、Viewには「View」という名前がついていた。なので、SpringBootの学習を始めたときに、困惑した。
処理はいくつかのファイル(クラス)に分ける
ロジックは単純に1つのファイルでは完結していないということ
コントローラークラスはサービスクラスを呼び出す
サービスクラスはマッパークラスを呼び出す
マッパークラスはデータベースを呼び出す
どれだけ簡単なロジックだったとしても、処理が様々なステップがあるということ。
1つのクラスの中ですべての処理は完結できない。
作成したクラスを型として使える
これが本当に厄介かつ分かりにくい。正直まだこれを書いてる私も、4割くらいしか理解してない。
だって初学者学習では、変数の前にはint id
のようにデータ型を置くように言われてて
急にItem item
とか出てきても、Item
ってデータ型なの?ってなるやろ!!!!
これはItemクラスに定義しているメンバー変数を扱うよという理解でOKだと思われる。
どれがどこの変数かわかりにくい
初学者に対しての学習だけでいいので、クラス間での変数の表記を分けてほしい。
例えば
@GetMapping("/todos/{id}")
ToDo getToDo(@PathVariable int id) {
return toDoService.getToDo(id);
}
public ToDo getToDo(int id){
return mapper.getToDo(id);
}
ToDo getToDo(int id);
<select id="getToDo" resultType="com.example.springboot_todo2.model.ToDo">
select * from todo where id = #{id}
</select>
getToDo
はそれぞれのクラスで定義してるので、クラスごとで変えてもOK。
変えるのが良いではなく、変えてもOKという認識を持ってることが大切な気がする。
例えば
@GetMapping("/todos/{id}")
ToDo getToDo(@PathVariable int id) {
return toDoService.getToDoo(id);
}
public ToDo getToDoo(int id){
return mapper.getToDooo(id);
}
ToDo getToDooo(int id);
<select id="getToDooo" resultType="com.example.springboot_todo2.model.ToDo">
select * from todo where id = #{id}
</select>
こんなかんじね。
ただ実務的には、メソッドがそれはそれはたくさん存在するので
メソッド名を統一して管理を容易にするのがセオリー
ただロジックを理解しておくことは大切だと私は思う。
セオリーはあるが正解がない
ぶっちゃけ、同じ結果を出力するための方法はかなりいろいろある。
SQL文を記述する方法も1つじゃないし、変数名の設定にはもちろん正解はない。
いろんな手法は知っておいたほうがいいよねって思う。
つまり、何を言いたいかというと、経験者のいうことっていうのは
経験則であって、重要なのは手法ではなく、そのコードを書く理由であるということ。
経験則を訳も分からずなぞるっていうのはあんまり意味がない。
だって全く同じコードのサービスはないから。
経験者から教えてもらうときは理由をしっかりと深堀して理解していきたい。
理解があいまいだった言葉をふんわりまとめる
オブジェクト
もの、実データ
メンバー変数
クラスの中に定義されていて、実データを格納するための箱のようなイメージ。
インスタンス変数、フィールド、データメンバーとかいろんな呼び方があるらしい。
カプセル化
privateでメンバー変数を管理する方法のようなイメージ
モデルクラスで使う
Getter Setter
カプセル化されているデータを取り扱う手法
Getterがカプセル化されているメンバー変数を閲覧する場合に使う。
Setterがカプセル化されているメンバー変数を編集する場合に使う。
mybatis
データベースとかSQL周りの便利機能が使えるプラグインのようなもの。
@Mapperとか使えるようになるやつ。