【Springboot / Kotlin】 アノテーションを学ぶ
はじめに
Springboot
を学ぶ中で様々な機能を持つアノテーションにでくわしました。
サンプルコードはKotlin
で記述。
こちらの記事でもSpringbootのアノテーション(DI系)について書いています。
【Springboot】アノテーションを学ぶ(DI系)
@Configuration
概要
- クラスに付与することで、Spring の色々な設定を Java コード上で行えるようにするためのアノテーション
-
@SpringBootApplication
の中でも@Configuration
を利用しているため、@Configuration
でアノテートした場合と同じ効果がある
サンプルコード
@Configuration
class SecurityConfig {
}
参考資料
- https://qiita.com/opengl-8080/items/05d9490d6f0544e2351a
- https://dev.classmethod.jp/articles/springboot-what-is-bean/
@Controller
概要
クラスに付与することでルーティングが可能になる
サンプルコード
@Controller
class HelloController {
}
@GetMapping("パス")
概要
関数に付与することでHTTPメソッドがGETのときに、指定したパスで対象の関数が呼ばれるようになる
※ HTTPメソッドに対応した@PostMapping
@DeleteMapping
なども用意されている
サンプルコード
@Controller
class HelloController {
// HTTP=GET の「/」 で index() が呼ばれる
@GetMapping("/")
fun index(model: Model): String {
model.addAttribute("message", "Hello World!")
return "index"
}
}
@RequestMapping("パス")
概要
クラスや関数に付与することでパスを指定できる
サンプルコード
@Controller
@RequestMapping("hello")
class HelloController {
// HTTP=GET の「/hello/world」でindex()が呼ばれる
@GetMapping("/world")
fun index(model: Model): String {
model.addAttribute("message", "Hello World!")
return "index"
}
}
@RestController
概要
戻り値のオブジェクトをJSONにシリアライズしてレスポンスとして返す
サンプルコード
data class Message(val message: String)
@RestController
@RequestMapping("hello")
class HelloController {
@GetMapping("/world")
fun index(): String {
return Message("ハローワールド")
}
}
// index() の返り値
{"message":"ハローワールド"}
@RequestParam
概要
関数の引数に指定することで、URLに含まれるクエリパラメータをクエリストリングで受け取ることができ、変数に入れることができる
サンプルコード
data class Message(val message: String)
@RestController
@RequestMapping("hello")
class HelloController {
@GetMapping("index")
fun index(@RequestParam("name") name: String): Message {
return Message("ハロー $name")
}
}
http://localhost:8080/index?name=Tanaka を叩く
// index() の返り値
{"message":"ハロー Tanaka"}
@PathVariable
概要
指定することで、URLに含まれる動的なパラメータを受け取ることができる。
サンプルコード
data class Message(val message: String)
@RestController
@RequestMapping("/")
class HelloController {
@GetMapping("index/{name}")
fun index(@PathVariable("name") name: String): Message {
return Message("ハロー $name")
}
}
http://localhost:8080/index/Tanaka を叩く
// index() の返り値
{"message":"ハロー Tanaka"}
@RequestBody
概要
関数の引数に引数に@RequestBodyをつけてClassを指定すると、jsonデータを受け取ることができる。
サンプルコード
data class Message(val message: String)
data class Request(val name: String)
@RestController
@RequestMapping("/")
class HelloController {
@PostMapping("index")
fun index(@RequestBody request: Request): Message {
return Message("ハロー ${request.name}")
}
}
- Content-Typeにapplication/jsonを指定
- リクエストボディに {"name": "Tanaka"} を設定
上記を行った上で http://localhost:8080/index を実行(筆者は Postmanを使って動作確認してます)
// index() の返り値
{"message":"ハロー Tanaka"}
@Transactional
トランザクションとは
プログラミングやweb開発におけるトランザクションの意味とは「複数の処理を1つにまとめたもの」。
こちらの記事が非常にわかりやすく参考にさせていただきました。
「トランザクション」とは何か?を超わかりやすく語ってみた!
概要
トランザクション管理の機能を有効にする。付与した関数内の処理に対しトランザクションを付与、処理が
- 正常に終わればコミット
- 例外が発生した場合はロールバック
という動作をする。
利用場面としては、データベースに対して行う処理で、複数のクエリを実行し、どこかでエラーが発生したらなかった事にしたい、というとき。
ただし、ロールバックを有効にするには、@Transactional
を付与した関数内で例外を投げる必要が有る。
サンプルコード
利用イメージはこのような感じ。↓↓(例:書籍情報を更新するupdate
関数でトランザクションを実施したい場合)
@Transactional
fun update(bookId: Long, title: String?) {
// bookIdに紐づく書籍情報が取得できなければ、例外を投げて処理をロールバックする。
bookRepository.find(bookId) ?: throw IllegalAccessException("存在しない書籍ID: $bookId")
bookRepository.update(bookId, title)
}
※ メソッド内のメソッドで例外を投げても無効となるので注意。
参考資料
- https://qiita.com/NagaokaKenichi/items/a279857cc2d22a35d0dd
- https://dev.classmethod.jp/articles/java-spring-boot-transactional-rollback/
最後に
SpringおよびSpringbootには便利なアノテーションがたくさん用意されているようです。
今後も触れたアノテーションについては適時調べて、追加していきたいと思ってます。
参考資料を記事の中でいくつも記載しております。わかりやすい内容のものばかりで本当に助かりました。ありがとうございました!
Discussion