はじめに
弊社平成最初で最後の新卒エンジニアの石川です。
この記事では、定期的なアウトプットによる知識定着向上のため、ここ最近学んだことをまとめています。
前回は Docker、Java(TDD、DI、Lambda 式、Stream、Optional)について学びました。 平成最初で最後の新卒エンジニアが平成最後の月の最初の週に学んだこと – L is Bエンジニアブログ
今回は前回学んだことを活かしつつ、Spring Boot を使って、ユーザー、トークン、エイリアスを管理する RESTful Web サービスを作成しました。データベースには PostgreSQL(本番用)と H2(テスト用)を使用しました。
====
あらかじめ、教育係の持田氏が必要最低限の骨組みプログラム(https://github.com/mike-neck/java-training-book/tree/master/spring-web)を用意してくれており、そこへ機能(API)を追加していくという課題が与えられました。(このプログラムはクリーンアーキテクチャを参考につくられているそうな)
用意されたプログラムは、ユーザーIDで検索したユーザーの情報(ユーザーID、ユーザー名、トークン、作成日時)を取得できる機能しかありません。そこから、ユーザーの作成、ユーザー名で検索したユーザー情報の取得、トークンの更新、ロギング、ユーザの削除、エイリアスの取得の6つの機能を追加していきました。
コードレビューは Github の Pull Request 上でおこない、改善すべきあらゆる点を持田氏に指摘していただきました。(コメント数はなんと241個!) 口頭で指摘して頂いたり、時折ペアプロでコードをブラッシュアップして頂いたりと至れり尽くせりです。
ここまで忍耐強く指導に付き合ってくださった持田氏、そして、直接の教育係ではありませんが、間接的にサポートしてくださった阿部氏には感謝感激です!ありがとうございます!
いままで以上に日々研鑽を積みつつ、これからは実戦に臨んでいく所存でありますのでどうぞ、よろしくお願いします。
雑記
以下に開発していく道中で、気になったことや思ったこと、重要なこと、持田氏・阿部氏の金言などをまとめました。
- 持田氏「不要なコメント行はがっつり消す」
- 今回不要になったけど、やっぱり将来使うかもしれないコードをコメントアウトで残したままコミットしたときのお言葉
- そういうことは git などのバージョン管理システムにまかせるべし
- 持田氏・阿部氏「Exception はそのまま使うべからず」
- 例外の宣言や補足が面倒だからといって使うと大変なことに(恐怖の throws Exception 感染,Java 本格入門 p191)
- 持田氏「例外のメッセージは printStackTrace ではなく Logger で表示する」
- Logger を使うとレベル(標準、エラー、警告とか)によって出力をフィルタリングできたり、ログの出力元をクラスの階層構造を辿って特定できるため
- 持田氏「String のような生のデータ型をビジネス層(サービス層)で扱わない」
- 生のデータ型の値を受け取ったコントローラ層が、その値をクラスでラッピングして次の層へ渡す
- これはクリーンアーキテクチャの教えかな?
- 持田氏「変更されたくないフィールドやローカル変数、関数の引数にはきちんと final をつける」
- 持田氏「いらない import は消す」
- ついつい忘れがち。途中から google-java-format を導入したから大丈夫なはず!
- git revert で過去のコミットを打ち消せる
- 間違ったコミットをしてしまっても安心。しかし、履歴は残る
- コミットを打ち消すというのは、あるコミットでの変更を削除するコミットをつくるということになるからか
- 持田氏「クラス内の値に対する何らかの処理をする場合、値を持っているクラスで行うのが正しい。getter or フィールドアクセスで値を取り出して何かをするのは同じ処理があちこちに分散してしまう」
- getter と public フィールドなしでプログラム書く練習しよっと
- モック伊藤 = mockito
- 最初聞いたときはどちら様かと思った
- テストでは大変お世話になりました。これからも末長くよろしくお願いします
- size() == 0 より isEmpty()
- 持田氏「Optional はパラメーターおよびフィールドでの使用を想定したインターフェースではない」
- 関数の戻り値に使おう
- テストの重要性を体感した
- 書くのは面倒だけど、一度書いてしまえば自動で何度でもコードをチェックできる
- Spring Boot を通して、前回はいまいちわからなかった DI の威力を実感できた
- それでもやっぱり DI の日本語訳はよくわからない
- 注入してるの依存性じゃなくてインスタンスじゃん!
- クリーンアーキテクチャの雰囲気がわかった気がする
- model 大事
- model は外部に依存しない
- すると model のテストがしやすくなる!
- テスト用に構築した H2 に接続するのに非常に時間がかかった
- 丸1日以上ハマってしまった
- どう select してもテーブルがないと怒られる始末
- H2 はリクエストの小文字をすべて大文字に変換する仕様のため、実際に存在するテーブル名と食い違っていたようだ
- テーブルやカラム名をすべてダブルクオートで囲んだらうまくいった
ここに挙げたのはほんの一部。 まだまだ学んだ大切なことはたくさんあるけれど忘れたここに記すには余白が狭すぎる。 己の血となり肉となっていると信じたい。
おわりに
まだまだ至らぬところが山積みですが、とりあえず新人社員研修に一区切りをつけることができました。
次回予告
さらば師匠 ! マスター・モチダ
(冗談です)