1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

@JsonAliasを使って後方互換性を保つイベントのフィールド名の変更

Posted at

はじめに

イベントソーシングにおいて、イベントストアに保存された過去のイベントは原則として書き換えることができません。
そうした中でイベントのフィールド名を変更したいことがあるかもしれません。

イベントのバージョニングをすることによって、古いイベントと新しいイベントの両方に対応した処理を実装することで解消できます。

一方で、フィールド名の変更のような「イベントの意味は大きく変わらない弱い変更」において、バージョニングやアップキャスターを導入することはコストが大きいです。

そうした中で@JsonAliasを使った、後方互換性を保ったイベントのフィールド名を変更を解説します。

@JsonAliasで後方互換性を保った変更

Jackson を利用してイベントを JSON 形式でシリアライズしている場合、@JsonAlias を使うことで、
「過去のイベントは古いフィールド名のまま」かつ「新しいイベントは新しいフィールド名で保存する」 ことを実現できます。

下記のようなUserNameとemailをフィールドにもつイベントクラスの変更について考えていきます。

Before Event
//userNameとemailのイベントクラス
public record UserRegisteredEvent(
        String userName,
        String email
) {}

UserRegisteredEventクラスのイベントはイベントストアに下記のように保存されます。

Old Event
{
  "userName": "alice",
  "email": "alice@example.com"
}

ここでUserRegisteredEventのuserName → name へフィールド名を変更します。

After Event
//nameとemailのイベントクラス
public record UserRegisteredEvent(
        @JsonProperty("name")      // 新しい正式名(シリアライズ時のキー)
        @JsonAlias("userName")     // 旧イベントJSONのフィールド名
        String name,
        String email
) {}

Jacksonの@JsonAliasを用いると、過去のuserNameのキーを新しいnameフィールドに自然にマッピングできます。

一方で、フィールドの構造や型変更がある場合は、@JsonAliasではできません。
あくまでもデシリアライズ時に古いイベントのフィールド名を受け入れるためにすぎません。

使い所

@JsonAliasによるアプローチが有効なケースとして、

  • フィールド名のみを変更したい
  • バージョニングや Upcaster を導入するほどの大きな変更ではない
  • 最小のコストでイベントスキーマの変更を適用したい

このようなケースにおいて@JsonAliasは最も低コストで確実な後方互換性を保った変更手段だと思います

終わりに

イベントソーシングにおいて、イベントスキーマの変更は容易ではありません。
一方で、フィールド名の変更など軽微な変更をバージョニングやアップキャストすることはコストが高く、運用負荷も増加します。

@JsonAliasを活用することで最小のコストで、後方互換性を保ちながらイベントスキーマを変化させることができます。

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?