복합키는 두 개 이상의 컬럼을 Key로 지정하는 것을 말합니다.
PK는 한 테이블에 한 개만 존재할 수 있지만, 한 컬럼만 기본키로 지정할 수 있는 것은 아닙니다.
Serializable은
자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)
VM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태
입니다.
자바와 마찬가지로 코틀린에서도 Serializable 인터페이스를 구현해야 하는데 [2] Domain - 엔티티 작성과 RepositoryCustom 에서 설명한 data class에 @Embeddable 어노테이션을 포함해 작성해야 합니다. data class이기 때문에 하나의 엔티티 클래스 파일 내부에 작성해도 되므로, 복합키를 생성 할 엔티티 클래스 { }내부에 작성 해 줍시다.
@Embeddable
data class IdAndRole(
private val userId: String,
private val role: String
): Serializable
userId와 role을 복합키로 갖는 엔티티 클래스가 있다고 가정하면 위 처럼 작성하면 됩니다. @Embeddable은 여러 속성을 묶어서 하나의 객체로 만들어주는 어노테이션이기 때문에 두 개 이상의 속성을 하나의 컬럼으로 만들어야 하기 때문에 @Embeddable을 사용한 data class를 생성하는 것 입니다.
@Entity
@IdClass(Member.IdAndRole::class)
class Member(
@Id
private val userId: String,
@Id
private val role: String,)
엔티티 클래스에는 @Entity 어노테이션과 복합키 매핑 어노에티션인 @IdClass를 적어주고,
아래 멤버 프로퍼티에는 방금 작성한 Serializable 클래스의 속성을 전부 @Id로 지정 해 줍니다. 이때 변수명은 일치해야 합니다.