はじめに
イベントソーシングにおいて、イベントストアに保存された過去のイベントは原則として書き換えることができません。
そうした中でイベントのフィールド名を変更したいことがあるかもしれません。
イベントのバージョニングをすることによって、古いイベントと新しいイベントの両方に対応した処理を実装することで解消できます。
一方で、フィールド名の変更のような「イベントの意味は大きく変わらない弱い変更」において、バージョニングやアップキャスターを導入することはコストが大きいです。
そうした中で@JsonAliasを使った、後方互換性を保ったイベントのフィールド名を変更を解説します。
@JsonAliasで後方互換性を保った変更
Jackson を利用してイベントを JSON 形式でシリアライズしている場合、@JsonAlias を使うことで、
「過去のイベントは古いフィールド名のまま」かつ「新しいイベントは新しいフィールド名で保存する」 ことを実現できます。
例
下記のようなUserNameとemailをフィールドにもつイベントクラスの変更について考えていきます。
//userNameとemailのイベントクラス
public record UserRegisteredEvent(
String userName,
String email
) {}
UserRegisteredEventクラスのイベントはイベントストアに下記のように保存されます。
{
"userName": "alice",
"email": "alice@example.com"
}
ここでUserRegisteredEventのuserName → name へフィールド名を変更します。
//nameとemailのイベントクラス
public record UserRegisteredEvent(
@JsonProperty("name") // 新しい正式名(シリアライズ時のキー)
@JsonAlias("userName") // 旧イベントJSONのフィールド名
String name,
String email
) {}
Jacksonの@JsonAliasを用いると、過去のuserNameのキーを新しいnameフィールドに自然にマッピングできます。
一方で、フィールドの構造や型変更がある場合は、@JsonAliasではできません。
あくまでもデシリアライズ時に古いイベントのフィールド名を受け入れるためにすぎません。
使い所
@JsonAliasによるアプローチが有効なケースとして、
- フィールド名のみを変更したい
- バージョニングや Upcaster を導入するほどの大きな変更ではない
- 最小のコストでイベントスキーマの変更を適用したい
このようなケースにおいて@JsonAliasは最も低コストで確実な後方互換性を保った変更手段だと思います
終わりに
イベントソーシングにおいて、イベントスキーマの変更は容易ではありません。
一方で、フィールド名の変更など軽微な変更をバージョニングやアップキャストすることはコストが高く、運用負荷も増加します。
@JsonAliasを活用することで最小のコストで、後方互換性を保ちながらイベントスキーマを変化させることができます。