Published on

Increment Key와 UUID를 동시에 사용하는 방법

Authors
  • avatar
    Name
    손예지(Liv)

팀 프로젝트를 진행하던 중, userId 컬럼은 Increment Key 타입을 사용해 내부에서 기본키로 사용하고, userNumber이라는 컬럼을 UUID 타입을 사용하기로 정하는 일이 있었습니다.

각각의 컬럼을 설정한 뒤 스프링부트 프로그램을 실행했을때 아래와 같은 오류가 발생했습니다.

Actual Results

Caused by: org.hibernate.AnnotationException: Property 'com.nfjs.fooddelivery.user.entity.User.userNumber' is annotated @GeneratedValue but is not part of an identifier

오류 내용을 확인해보면, userNumber 컬럼이 @GeneratedValue 어노테이션이 붙어있지만 해당 필드가 identifier 즉 식별자 (@Id)로 지정되어 있지 않다는 의미로 해석할 수 있습니다.

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
@Column(name = "user_id", nullable = false, updatable = false)  
private Long userId;  
  
@GeneratedValue(strategy = GenerationType.UUID)  
@Column(name = "user_number", columnDefinition = "uuid")  
private UUID userNumber;

해결 방법

이런 오류가 발생한 이유는 @GeneratedValue 어노테이션을 한 엔티티에 두 번 사용했기 때문입니다. @GeneratedValue는 기본키로 사용할 때 자동 생성하는 용도로 사용할 수 있습니다. 기본키를 두개의 컬럼에 설정하려고 했기 때문에 발생했다고 할 수 있습니다.

아래와 같이 userId를 기본키로, userNumber 컬럼을 UUID 타입으로 설정한 후 재 실행시 정상적으로 실행되는 것을 확인할 수 있었습니다.

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
@Column(name = "user_id", nullable = false, updatable = false)  
private Long userId;  
  
@Column(name = "user_number", columnDefinition = "uuid")  
private UUID userNumber;

알게된점

UUID 값을 생성하려면 @GeneratedValue 어노테이션이 필요하다고 생각했는데, 기본키로 사용할 때만 해당된다는 사실을 몰랐기 때문에 발생했던 이슈였습니다. 하나만 알고 둘은 모른다는 말이 어떤 말인지 다시 한번 체감할 수 있었습니다.

참고자료:
An Overview of Identifiers in Hibernate/JPA
Simple identifiers