본문 바로가기
Spring

[Spring] Javers로 자바 객체 비교 쉽게 하자!

by 가드 2022. 11. 11.
728x90

Javers는 자바 객체 비교 라이브러리이며 비교할 두 객체 변수들의 Diff 정보를 간단하게 얻을 수 있다.

Javers는 많은 기능들을 지원하는 것 같다 RDB Repository의 Entity의 변경사항을 인지할 수도 있고 직접 두 객체를 compare 함수를 이용하여 비교 정도를 획득할 수도 있다.

이번 포스팅은 Javers의 Compare 함수를 이용하여 두 객체 비교 하는 방법에 대해 기록해보도록 하자.

Javers Document 참고

Gradle Dependancies

implementation group: 'org.javers', name: 'javers-core', version: '6.7.0'

Data Class

public class Person {
	private String name;
	private int age;
	private String phoneNumber;
	private String gender;
        private Address address;
    // getter, setter 생략
}

public class Address {
	private String city;
	private String street;
    // getter, setter 생략
}

예제로 Person 객체에 name, age, phoneNumber, gender의 변수들이 있고 하위 객체로 Address가 존재하는 객체가 있다고 가정해보자.

Diff Code

 @Test
public void javersTest() {
	Javers javers = JaversBuilder.javers().build();
	Person person1 = Person.builder().name("tester")
		.age(20)
		.phoneNumber("1111")
		.gender("Mail")
		.address(Address.builder()
			.city("seoul")
			.street("100")
			.build()).build();
	Person person2 = Person.builder().name("tester")
		.age(30)
		.phoneNumber("2222")
		.gender("Mail")
		.address(Address.builder()
			.city("seoul")
			.street("200")
			.build()).build();
	Diff diff = javers.compare(person1, person2);
	assertThat(diff.getChanges().size()).hasSize(3);
}

 

Person의 객체 두개를 준비했고 age, phoneNumber, address.street 3개의 변수 값이 다르도록 설정하고 javers.compare를 호출했고 비교 객체는 Diff 변경 개수가 3개인 것을 확인했다.

Diff 객체 정보를 확인해보자.

 

diff

Diff:
* changes on dto.Person/ :
  - 'address.street' changed: '100' -> '200'
  - 'age' changed: '20' -> '30'
  - 'phoneNumber' changed: '1111' -> '2222'

 

Diff 객체는 같지 않는 변수들의 정보를 컬렉션 형태로 제공해주고 있다.

ValueChange{ property: 'age', left:'20',  right:'30' }

  • property : 비교 변수명
  • left : javers.compare 첫 번째 파라미터 객체 변수 값
  • right : javers.compare 두번째 파라미터 객체 변수 값

javers이 없이 두 객체를 비교했을 경우에 name.equals(name) 이런 식으로 객체의 모든 필드의 비교 코드를 넣었을 것이다. 아니면 이전에 내가 포스팅했던 Reflection으로 객체 비교하는 방법등을 이용하여 좀 더 편리하게 비교할 수는 있겠지만 말 그대로 비교뿐이지 javers처럼 비교에 대한 정보들을 제공해주려면 좀 더 복잡도 있게 개발을 해야 한다. 

그리고 Javers는 비교 알고리즘 옵션이 많아서 원하는 비교방식을 상황에 맞게 변경할 수도 있다는게 큰 장점이다.

javers는 사용하기 간단하지만 강력한 비교 라이브러리라 생각된다. 내 프로젝트에는 이미 entity 변경에 대한 로그를 남기고 있는데 이때 javers 라이브러리를 사용해서 간단하게 적용하였다. 이쁜 녀석이다.

300x250

댓글