- Published on
Increment Key와 UUID를 동시에 사용하는 방법
- Authors
- 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