우리가 도메인을 만들때 보통은 기본키(PK)를 만들고 도메인을 만든다.
하지만 하나의 속성으로는 기본키가 될 수 없는 경우가 있다.
그때 사용하는 것이 복합키이다. 컬럼을 기본적으로 정하고 후에 유니크한 키값을
같이 묶어주는 형식으로 복합키를 만든다.
우리는 spring 가지고 orm 을 사용하여 도메인을 생성을 한다.
그럴때 사용하는 것이@EmbeddedId
어노테이션 과@IdClass
을 이용하여 도메인을 생성을 하면 복합키가 생성이 된다.
아래 예제를 보고 생각을 더 해보자.
위의 테이블을 JPA 를 이용해서 만들것이다.
url , email 컬럼이 복합키로 이루어져 있다.
나머지 컬럼들은 table 의 컨텐츠들 이다.
JPA에서 복합키를 만들기 위해서는
@Embeddable
을 사용을 한다.
Serializable
를 상속받아야 됩니다. DB 영속성 때문에 안할시 에러가 발생을 합니다.
CustomPK 클래스를 사용 도메인에 작성을 하고
@EmbeddedId
를 붙여주면 끝이 난다.
복합 키를 메핑 시키는 방법 중 다른
@IdClass
어노테이션을 사용하는 방법이 있다.
물리적인 모델의 차이 점은 없다.
하지만 결합 된 pk가 의미있는 엔티티 자체이거나 코드에서 재사용 될 때 의미가 보여준다.
특별한 의미가 없을 때 유용한다 굳이 무언가 더 작성하고 그런것이 아니다.
@EmbeddedId
를 사용할때 굳이 복합키만 사용할때만 사용한다라고 정의는 할 수 없다.
어떤 사람은 엔티티 가독성을 높이기 위하여 사용하는 사람도 있다.
하지만 필자의 경우 가독성 떄문에 굳이@EmbeddedId
어노테이션을 사용하면서
가독성을 높인다고 생각이 되지 않는다.
제 생각으로는 복합키나 다중키 사용할때만 사용하는 것을 권장한다.