はじめに
Spring Data JPA で、監査情報を自動付与してみます。
監査情報とは「いつ」「だれが」データを登録したかの情報で、この情報があると、サービス運用時のトラブル対応時に役立ちます。
本当は Spring の主要機能の一つである AOP を学習するための題材として考えていたのですが、意外な落とし穴がありました。。
監査情報の記録方法
アノテーションを設定
なんと便利なことに、監査情報を付与するアノテーションがありました。いちいち AOP を実装する必要がないのです!
こんな感じで大丈夫です。
@CreatedBy
private Long createMemberId;
@CreatedDate
private Date createDate;
@LastModifiedBy
private Long modifyMemberId;
@LastModifiedDate
private Date modifyDate;
登録者/更新者情報
以前の投稿で認証機能を実装してみましたが、今回は 操作者には認証情報のIDを設定することにします。
こんな感じで設定します。
JpaConfig.java
@EnableJpaAuditing
@Configuration
public class JpaConfig
{
@Bean
public AuditorAware<Long> auditorAware()
{
return new SecurityAuditor();
}
public static class SecurityAuditor implements AuditorAware<Long>
{
@Override
public Long getCurrentAuditor()
{
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated())
{
return null;
}
MemberEntity memberEntity = (MemberEntity) authentication.getPrincipal();
return memberEntity.getId();
}
}
}
エンティティの共通部分を別クラスにまとめる
エンティティごとに監査情報用の項目を定義するのは面倒なので、親クラスでまとめて定義することにします。
省略してますが、必要に応じて、setter/getter も実装してください。
ポイントは、MappedSuperclass アノテーションをつけることです。
BaseEntity.java
@MappedSuperclass
public class BaseEntity
{
@CreatedBy
private Long createMemberId;
@CreatedDate
private Date createDate;
@LastModifiedBy
private Long modifyMemberId;
@LastModifiedDate
private Date modifyDate;
}
終わりに
Spring 便利ですね。
機能豊富で開発が簡略化できる仕組みがたくさんそろってるけど、なかなか追いつけないのが悩みの種です。