흔히 엔티티에 Id를 지정할 때 Auto Increment 형태로 컬럼을 지정한다.
이를 스프링부트로 구현할 땐 다음과 같이 사용해왔다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratredValue를 지정하면 따로 지정할 필요없이 자동으로 컬럼의 값이 생성된다.
이때 생성 전략을 선택해야 되는데 이를 IDENTITY로 지정하면,
Auto Increment로 Id 값을 생성하는데 이 과정을 데이터베이스에게 위임한다.
즉, 데이터베이스에 저장할 엔티티에 대한 영속성 컨텍스트가 생성되면 Id 값에 해당하는 컬럼이 비워져있다.
그래서 Id가 비워져있는 엔티티를 디비에 insert하고 다시 디비로부터 지정된 Id를 받아와 영속성 컨텍스트에 저장한다.
복합키 지정시 문제
프로젝트에서 복합키를 사용 해야하는 사정이 생겨버렸다.
사실 유일성이 보장되는 Id를 사용할 경우 복합키를 사용할 필요는 없지만 어쩌다 그렇게 됐다.
이때 문제가 발생했다.
Identity generation isn't supported for composite ids
복합키 ID는 생성 지원이 안 된다는 에러가 발생했다.
구글링을 해보니 아무래도 내부 구현상 키를 불러올 때 복합키일 경우 대상 칼럼을 구분할 수 없나보다.
(원하는 컬럼만 추출하는 추가 쿼리가 필요해서인듯)
그래서 사용한 전략이 SEQUENCE이다
GenerationType.SEQUENCE
SEQUENCE는 시퀸스를 이용해서 Id를 독립적으로 관리한다.
(시퀸스: 유일한 값(id)를 생성하는 객체)
그렇기 때문에 영속성 컨텍스트 생성시 바로 시퀸스를 이용하여 Id값을 가져와 채워 넣을 수 있게 된다.
즉 insert가 끝부분에 일어나게 된다.
SEQUENCE를 이용해 Auto Increment 컬럼을 관리하게 되면,
복합키를 이용하더라도 아무 문제가 없이 엔티티가 생성되는 것을 확인할 수 있다.
'스프링부트 메모' 카테고리의 다른 글
[스프링부트] Builder 패턴에 대해 알게 된 점 (0) | 2024.11.10 |
---|---|
[스프링부트] 자동 답변 봇 구현 (AI 서버와의 연결) (2) | 2024.09.25 |
[스프링부트] 이메일 전송 기능 구현하기 (0) | 2024.09.23 |
[스프링부트] 디스코드 웹훅 연동하기 (1) | 2024.09.22 |
[스프링부트] 메모 시작 (0) | 2024.09.22 |