はじめに
今回は、私がSpringBootを初めて触ってみた際にかなり詰まったので、自分自身への備忘録も兼ねてわからなかったことなどをまとめていきます。(もしかして...、わかったことの方が少ないのでは笑...)
前提
参考程度にSpringBootをやる前の状態の筆者の技術スタックはこんな感じです。(SpringBootに関連しそうなものだけピックアップしてます)
- Java: 大学の講義で一応触った程度
- Kotlin: 昔、触ってみようとしたけどよくわからなくて"Hello World!"を出力したくらい
- SpringBoot: New!!ワクワク
困ったこと
アノテーションよくわからん
まず、困ったのがアノテーションです。簡単なCLIアプリケーションぐらいなのでアノテーションって何?ってなりました。ザッと検索するとアノテーションは注釈だそうです。注釈って言われてもよくわからないですね。
アノテーションは機能付きのコメントという感じに自己解釈しました。SpringBootでは
@Controllerや@Serviceなどといったアノテーションを使用します。
例
@Controller
class UserController {
}
DI(Dependency Injection)?
SpringBootを含むSpringFrameworkはDIコンテナってのをよく使います。DIは要するに依存性の注入とのことなのですが、依存性?注入?コンテナ?よくわかりませんでした。正直、今でもわかってる気はしない...。
現状これだなと思っているのはこんな感じ
- オブジェクトを動かすのに必要なオブジェクト(コンポーネント)を実行時に外部から取ってきて使用するのがDI
- DIコンテナはコンポーネントを登録したり、登録したコンポーネントを使用したいオブジェクトに渡す機能を持っている
- オブジェクトを受け取る方法はいくつかある
@Repository
interface UserRepository {
fun hogehoge()
}
↑で@Reposiroryアノテーションを付けたUserRepositoryインタフェースはDIコンテナに登録される
@Service
class UserService(
private userRepository: UserRepository
) {
///
}
↑のUserServiceクラスのコンストラクタでDIコンテナに登録されているUserRepositoryインタフェースのインスタンスを使用できるようにした。
AOP(アスペクト指向プログラミング)?
どうやらSpringBootはアスペクト指向プログラミングを使うらしいです。
あまりよくわかっていないのですが、
- 共通の処理を抜き出す
- 必要に応じて共通の処理を横断的に様々なクラスで取得して使用する(要するにDI?)
といったことのようです。詳しいことは私がもっと詳しくなったら記事できたらなぁと思います。
SpringSecurity難しい
SpringSecurityはSpringFrameworkのプロジェクトで作られたアプリケーションの認証と認可を専門としたフレームワークです。これを使用してアプリケーションのログイン周りを実装していきます。今回、筆者はSpringBootをAPIとして作成しており、認証にはJWTを用いました。
しかし、SpringSecurity自体にはJWTを発行したり、デコードしたりといったよしなにしてくれる機能は無いです。
一度、途方に暮れました......。
最近は何でもよしなにしてもらえるので忘れてました......。
フレームワークは何でもよしなにしてくれるということはありません。ただ、SpringSecurityにはフィルターと呼ばれるものがあり、自分でフィルターを作成すれば好きなように認証や認可を行うことができそうです。私の場合はログイン時にJWTを生成し、レスポンスヘッダーにJWTを格納するといった内容のフィルターを作成し、ログインに成功した際にフィルターの処理が実行されるようにしました。
最後に
今回、初めてSpringBootを触ってみました。ざっくりとした感想としてはアプリケーションの実装を行う際の選択肢が豊富だなと思いました。JavaやKotlinで作成するためライブラリやフレームワークが多いです。そのため、ディレクトリ構成や使用するORマッパーも選択肢が多いです。今回はKotlinを使用していたのですが、Kotlinが書きやすいので書くストレスが少なかったです。(さすがコトリン!)