보통 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 자동 생성 보다는 어플리케이션 에서 생성해 주는것이 좋다고 생각한다.
'Backend > SpringBoot' 카테고리의 다른 글
| [Spring Security] XSS 방어 (0) | 2026.02.11 |
|---|---|
| OAuth 연동 (0) | 2026.02.06 |
| Cursor 기반 Paging 추가 정리(QueryDsl 기준) (0) | 2026.02.03 |
| 임시 비번 발급 후 비교할때 주의점(PasswordEncoder) (0) | 2026.02.02 |
| Hexagonal Architecture 일부적용 및 느낀점 (0) | 2026.01.30 |