💨

【Springboot / Kotlin】 アノテーションを学ぶ

2021/05/29に公開

はじめに

Springbootを学ぶ中で様々な機能を持つアノテーションにでくわしました。

サンプルコードはKotlinで記述。

こちらの記事でもSpringbootのアノテーション(DI系)について書いています。
【Springboot】アノテーションを学ぶ(DI系)

@Configuration

概要

  • クラスに付与することで、Spring の色々な設定を Java コード上で行えるようにするためのアノテーション
  • @SpringBootApplicationの中でも@Configurationを利用しているため、@Configurationでアノテートした場合と同じ効果がある

サンプルコード

@Configuration
class SecurityConfig {
}

参考資料

@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)
}

※ メソッド内のメソッドで例外を投げても無効となるので注意。

参考資料

最後に

SpringおよびSpringbootには便利なアノテーションがたくさん用意されているようです。
今後も触れたアノテーションについては適時調べて、追加していきたいと思ってます。

参考資料を記事の中でいくつも記載しております。わかりやすい内容のものばかりで本当に助かりました。ありがとうございました!

Discussion