개발을 하다가 문득 사용자의 추천 설정과 같은 정보들의 변경 이력을 관리하고 있지 않고 있었다라는 것을 깨달았다.
예상되는 문제는 사용자에게 추천을 했는데 로직 상 문제 없는 추천에 대해서 사용자가 착각해서 이거 왜 추천되나요? 라고 했을 때이다.
이 유저가 추천 설정이 C 라고 돼 있을 때, 신고 당시 A 였는지 B 였는지 계속 C인 상태였는지 파악이 되지 않아 파악에 굉장히 어려울 것 같았다.
처음에는 아래와 같은 테이블로 작업을 할까 했었다.
왜냐하면 제일 간단하다고 생각했고, 해당 테이블 하나로 여러 데이터의 변경 이력을 관리할 수 있으니까 관리 포인트도 줄일 수 있을 것 같았다.
id | user_id | target | before | create_date |
pk | 변경 필드 | 변경 전 데이터 |
그러나 http put method 와 같이 여러 데이터를 다 변경시켜버리는 기능이 존재했을 때 이걸 json 으로 박아야 할지,, 변경되는 데이터 체크해서 하나하나 로우를 쌓아야 할지,,, 하여튼 이런 문제가 발생했다.
그래서 방금 생각은 지우고 다른 것을 찾아보았다.
그냥 단순히 해당 요청이 있을 때 로깅을 해서 aws cloud watch 쌓도록 하여 한 달동안의 데이터는 cloud watch 에서 쿼리 넣어서 찾고 그 이후 데이터는 s3 에,,,
하여튼 이건 좀 투머치하며 관리 포인트가 더 늘어나는 것 같아서 생각을 그만 두었다.
그래서 찾은게 spring-data-envers 였다.
간단하게 이야기 하자면 의존성 추가 후 관련 config 값 넣고 어노테이션 달면 알아서 테이블과 똑같은 테이블을 생성해서 변경 이력을 관리해주는 라이브러리이다. jpa 와 호환이 되며 해당 라이브러리의 구현체도 hibernate 인 것 같다.
어떻게 동작하고 어떤 식으로 사용해야 하는지는 따로 작성하지는 않겠다.
물론 변경 이력 관리해야 할 테이블만큼 N 개가 늘어나지만,,, 그래도 DB 에서 관리할 수 있으며 제일 큰 건 알아서 이력을 관리해주는 점이다.
단순 조회, paging 까지 가능하다.
지금 현재 개발 중인 서비스 규모에도 잘 맞는 것 같다.