Backend/SpringBoot

[Entity] GeneratedValue 대신 TSID 사용하기

Dean83 2026. 2. 10. 15:28

보통 Entity를 구성할 때 id 필드 값에 아래의 어노테이션을 사용할 때가 많다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

 

이 경우, DB의 DDL 에도 아래와 구성을 해 주어야 한다.

id                BIGINT GENERATED BY DEFAULT AS IDENTITY

 

의미 부터 보자면, db에 값을 저장할때 id 값을 db 에서 자동으로 생성하여 증가 해주는것을 의미한다. (JPA에서 해주지 않는다)

 

이 경우 다음의 문제점이 발생한다.

  • 대량의 bulk insert가 필요 할 때 bulk 동작을 JPA 및 hibernate가 수행하지 않고, 건별로 insert 쿼리를 날린다.
    • 속도가 엄청나게 느리고 과부하가 걸린다.
    • 데이터 1개를 입력 -> 증가된 ID 값을 받아옴 -> 다음 데이터 입력 을 해야 하므로 bulk insert가 수행되지 않는다.

 

따라서, @TSID 어노테이션 을 이용하여 프로그램 단에서 자동으로 ID를 생성해 주도록 한다.

이를 이용하려면 다음을 따라야 한다.

  • DDL 에서 GENERATED BY DEFAULT AS IDENTYTY 항목 삭제
  • Entity의 id 컬럼에서 @GeneratedValue 대신 @Tsid 어노테이션 이용
  • id 는 bigint (Long) 형으로 구성

 

build.gradle 에 추가

  • 버전은 확인 필요 (작성 현 시점 기준 버전임)
  implementation 'io.hypersistence:hypersistence-utils-hibernate-63:3.15.1'

 

@Tsid 어노테이션 사용

  • 엔티티의 ID 컬럼에 기존 @GeneratedValue(strategy=GenerationType.IDENTYTY) 대신 @Tsid 어노테이션 사용
	.....
    @Id
    @Tsid
    @Column(name = "id", nullable = false)
    protected Long id;
    
    .....

 

 

TSID 특징

  • Bigint (Long) 형 이다.
  • 시간정보 + 랜덤값 을 이용하여 아이디를 생성한다.
  • 시간순 정렬이 가능 하다

개발 단계라 실제 데이터가 없다면, 기존 데이터 삭제 -> 테이블 수정을 통해 Tsid를 사용할 수 있다. 

그러나 만일 실제 데이터가 있는 상황이라면, 무턱대고 변경 할 수가 없다. 

 

이를 해결하기 위해선 다양한 방법이 있겠으나, 나라면 bulk insert가 필요한 항목에 한해

  • Raw SQL을 통해 Bulk insert 를 수동으로 구현하여 운영 (기존 id 자동 생성 유지) 을 할 것 같다. 

그러다 점차 해당 항목들이 많아 진다면, 그때는 Tsid를 도입하고, 기존 데이터는 점진적으로 새 테이블로 마이그레이션 수행을 할 것 같다.

따라서 처음부터 id 자동 생성 보다는 어플리케이션 에서 생성해 주는것이 좋다고 생각한다.