@GenericGenerator
🧷 @GenericGenerator
정의
@GenericGenerator는 Hibernate에서 사용자 지정 식별자 생성 전략을 정의하는 애너테이션이다.@GeneratedValue의generator속성과 함께 사용해서 기본 제공 전략으로 처리하기 어려운 식별자 생성 방식을 적용할 수 있다.
기본적으로 JPA의 @GeneratedValue는 표준적인 생성 전략을 제공하지만, 프로젝트에 맞는 커스텀 생성 규칙이 필요할 때 @GenericGenerator를 사용한다.
🧩 역할
- Hibernate 전용 식별자 생성 전략을 정의한다
- ==
@GeneratedValue(generator = "...")와 연결해서 사용한다** - **시퀀스, UUID, prefix가 포함된 문자열 등 커스텀 PK 생성에 활용한다==
🛠 사용법
커스텀 생성기 클래스 작성
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
import java.io.Serializable;
public class StringSequenceIdentifierGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) {
String sql = "SELECT my_sequence.NEXTVAL FROM DUAL";
Long seqValue = ((Number) session.createNativeQuery(sql).getSingleResult()).longValue();
return String.valueOf(seqValue);
}
}
엔티티에 적용
import org.hibernate.annotations.GenericGenerator;
@Entity
public class Role {
@Id
@Column(name = "ROLE_PK")
@GeneratedValue(generator = "role_seq_gen")
@GenericGenerator(
name = "role_seq_gen",
strategy = "com.example.StringSequenceIdentifierGenerator"
)
private String pk;
}
사용 예시
- Oracle 시퀀스 기반 문자열 PK 생성
- UUID 규칙을 반영한 문자열 키 생성
- 접두어가 포함된 업무용 식별자 생성
⚠️ 주의사항
@GenericGenerator는 JPA 표준이 아니라 Hibernate 전용 기능이다.- 생성 로직이 프로젝트마다 달라지므로 재사용성을 고려해야 한다.
- 커스텀 생성기는
@GeneratedValue와 함께 사용해야 한다. - DB 시퀀스나 UUID 정책과 충돌하지 않도록 생성 규칙을 명확히 해야 한다.
📌 정리
@GenericGenerator는 Hibernate 전용 커스텀 식별자 생성 설정이다.@GeneratedValue(generator = "...")와 함께 사용한다.- 표준 전략으로 해결하기 어려운 PK 생성 규칙이 있을 때 유용하다.
댓글남기기