Spring Data Envers로 이력 관리 자동화하기
·
spring
데이터의 변경사항마다 이력을 관리하는 것은 반복적이고 지루한 작업이다.이를 해결해 줄 수 있는 강력한 라이브러리인 Envers가 있다. JPA를 사용하는 환경에서는 이력 관리를 손쉽게 자동화할 수 있게 지원하고 있다.이번 글에서는 Spring Data Envers를 실무에 적용하면서 겪었던 경험과 문제 해결 방안을 공유하고자 한다.Spring Data Envers란?소개Hibernate Envers의 확장으로, Spring Data와 통합된 감사 라이브러리데이터 변경 이력을 자동으로 관리하는 기능 제공주요 특징엔터티의 Create, Update, Delete 이력 관리간단한 설정으로 엔티티 버전 관리 활성화이력 조회 API 제공(이전 상태와 비교 가능)기본 아키텍처이력 대상 _AUD 테이블 생성 (엔티티..
JPA 상태 패턴 적용하기
·
spring
상황 결재 시스템에 필요한 상태를 아주 간략하게 표현했다.사용자가 결재를 저장하고 상신요청을 하게되면 결재 라인을 타게되어 결재자가 기안문서를 볼 수 있다.이후 결재 라인에 결재자 A, B, C 가 존재한다고 가정하고 정상적인 시나리오만 작성해 본다.모두 승인하는 케이스사용자가 기안을 올리면 상태는 저장에서 상신요청으로 변경된다.A가 결재를 승인하면 결재 상태는 상신 요청에서 진행중으로 변경된다.B가 결재를 승인하면 결재 상태는 그대로 진행중이다.C가 결재를 승인하면 결재 상태는 진행중에서 완료로 종결된다.한명이라도 반려하는 케이스A가 결재를 승인하면 결재 상태는 상신 요청에서 진행중으로 변경된다.B가 결재를 반려하면 결재 상태는 반려로 종결된다.문제점위 상태 흐름대로 해피 케이스만 실행되면 좋지만 항상..
JPA 환경에서 TSID(Time-Sorted Unique Identifier) 생성하기
·
spring
UUID 단점 중 하나 UUID는 무작위로 값을 생성하기 때문에 순서가 보장되지 않는다. 이런 이유로 데이터베이스에서 UUID 값을 인덱스로 사용한다면 인덱싱이 어려울 수 있다. TSID로 해결 UUID 인덱싱의 어려움을 해결할 수 있는 방법은 정렬을 하는 것이다. 시간 기반으로 정렬되고 중복되지 않는 고유한 식별자인 TSID를 이용하면 어느정도 해결할 수 있어 보인다. 사용 방법 하이버네이트의 UuidGenerator 어노테이션을 사용하면 손쉽게 TSID를 생성할 수 있다. (하이버네이트 6.0 버전 이상 사용 가능) TIME Enum 값을 보면 시간과 IP 기반으로 생성한다는 것을 확인할 수 있다. 이는 다수의 인스턴스 환경에서 같은 시간에 접근해도 고유한 값을 가질 수 있다는 것을 의미하는 것 같다..
JPA에서 Bulk insert 사용하기
·
spring
Spring Data JPA에서는 컬렉션을 저장하는 메서드를 지원하고있다. 해당 메서드를 사용해 컬렉션을 저장하면 데이터가 단건씩 INSERT되는 문제가 있다. 데이터가 적다면 문제가 없겠지만 대량의 데이터가 단건씩 저장되면 네트워크, DB 비용이 많이 발생할 수 밖에 없다. 이 문제를 해결하기 위해서 2가지 방법이 존재한다. 쿼리를 직접 작성 BatchSize 사용 1번 방법도 좋지만.. 귀찮기도하고 JPA Repository를 그대로 사용하고 싶다면 2번 방법이 좋을 것 같다. 배치 사이즈를 사용하는 방법은 다음과 같다. hibernate batch size 프로퍼티 값 설정 배치사이즈 만큼 묶어 전달 JDBC reWriteBatchedInserts 파라미터 옵션 활성화 배치사이즈 만큼의 INSERT..
noose
'JPA' 태그의 글 목록