Spring Frameworkにおけるアノテーションとは
Spring Frameworkではアノテーションを使用することで、フレームワークが提供している機能を簡単に利用することができる。
使用方法も簡単で、使用したいJava要素にアノテーション名を書き加えるだけ。
例)
@Controller
public class SampleController {
//処理
}
この例では@controllerアノテーションを使用してます。
@controllerアノテーションを付与することでSpringはこのクラスをコントローラーであることを認識し、HTTPリクエストを受け付けるようになります。
ヒトが読む場合にも、アノテーション一つでコントローラーと識別できるので可読性が上がりますね。すごい
@transactionalアノテーション
今回使用する@transactionalアノテーション。
このアノテーションをメゾッドに付与することでコミット/ロールバック/セーブポイント等のトランザクションに関する一連の処理を行ってくれます。
使い方
上の例の通り、トランザクション処理を行いたいメゾッドに付与します。
例)
@Service
public class Sample implements SampleService {
@Autowired
private UserRepository userRepository;
@Transactional
public User createUser(User user) {
// トランザクション処理
}
}
これだけでcreateUserメゾッド開始時に自動的にトランザクション処理が機能する。正常に終了すればコミット、失敗すればロールバック処理が行われる。
注意点
ネストしているメゾッドは呼び出し先にもアノテーションをつける
トランザクション処理を開始したメゾッドが他のメゾッドを呼び出す場合、そのメゾッドにもアノテーションを付与する
@Service
public class A {
@Transactional
public void doA() {
doB();
}
public void doB() {
//DB処理
}
}
途中で呼び出されているdoBには@transactionalアノテーションがついていないため、doBで書かれている処理はアノテーションの対象外になってしまう。
呼び出し先のメゾッドにも@transactionalをつけよう。
コントローラー処理に@transactionalアノテーションはつけないようにする
コントローラー層で@transactionalを付与してはいけない、service層で@transactionalアノテーションを付けるのが良い
ダメな例)
@Controller
public class Controller {
@Autowired
private Service service;
@Transactional
@PostMapping("/service")
public ResponseEntity<> doService(@RequestBody service) {
//処理
}
}
エラーハンドリング
@transactionalはRuntimeExceptionをスローするメソッドの場合にロールバックを行います。Exceptionをスローする場合は、catchして処理するか、明示的にトランザクションをロールバックする必要がある
以下のように。@transactionalに(rollbackFor = Exception.class)をつけてあげると、RuntimeException,Exceptionとエラーの種類にかかわらずロールバックするようになる。
@Transactional(rollbackFor = Exception.class)
public void doSomething() throws IOException {
// 例外が発生する可能性のある処理
}
終わりに
Spring Frameworkにはいろいろ便利なアノテーションがあるみたいなので、また時間あるときにほかの情報についてもまとめていきたい