프로젝트를 진행하던 중, 데이터베이스에서 두 개의 PK를 갖게되는 상황이 발생하였습니다. 그래서 오늘은 JPA에서 복합키로 DB를 설계하는 방법을 알아보겠습니다.
복합키란?
간단하게 말하면, PK(자연키)가 2개 이상 존재하는 것을 의미합니다. PK는 DB에서 유일성을 보장하는 속성을 의미하는데, 그러한 PK를 두 개로 지정함으로써, 유일성을 갖게 합니다.
예를 들면, 아래와 같은 DB가 있다고 해봅시다. 이 DB에서는 일정 시간마다 모든 식당의 현재 인원을 받아온다고 가정합니다.
여기서 만약 우리가 PK를 한개만 잡는다면, 유일성을 보장하지 못하므로 적절하지 않습니다. 물론 ID 속성을 넣어서, 유일성을 보장하게 할 수 있지만, 저희는 이 속성값만 사용해서 PK를 만들어야한다고 해봅시다.
그러면 저희가 식당 이름과 시간을 PK로 만든다면 시간과 식당이름을 결합한 PK는 유일성이 보장됩니다. 예를 들어, 23년 8월 18일 11시 4분에 해당하는 식당 1은 하나밖에 없는거죠.
이렇게 두 개의 PK를 잡았습니다. 그럼 JPA에서 두 개의 PK는 어떻게 설정해주어야할까요??
복합키 설정하기
여기서는 임베디드 타입을 활용하여 복합키를 설정해줍니다. 임베디드 타입에 대한 설명은 아래의 글을 참고해주세요!
2023.08.08 - [JPA] - 임베디드 타입(Embedded Type)이란?
우리는 복합키를 사용하기 위해서 복합키로 사용할 속성을 갖고 있는 클래스를 선언해줘야합니다. 이 때, @Embeddable을 클래스 위에 적어줘야하고 Seriezable을 implements 해야합니다.
@Embeddable
public class nameTime implements Serializable {
private String name;
private LocalDateTime time;
}
이렇게 선언해주었다면, 이제 엔티티를 만들어봅시다.
@Entity
@Getter @Setter
public class connectedTable {
@EmbeddedId
private nameTime nameTime;
private int connected;
}
단순히 엔티티에 복합키를 묶어놓은 클래스 위에 @EmbeddedId를 선언해주면 됩니다. 이렇게 하고, 실행시켜 DB를 살펴봅시다.
DB가 잘 구성된 것을 알 수 있습니다. pk도 두 개로 잘 구성이 되어있네요.
'JPA' 카테고리의 다른 글
[JPA] 변경 감지와 병합 (0) | 2024.01.15 |
---|---|
[JPA] @Id의 마법(feat. @GenerateValue) (0) | 2023.08.18 |
@Transactional의 선언 위치 (0) | 2023.08.17 |
DTO, DAO란? (DAO와 Repository의 차이) (0) | 2023.08.10 |
임베디드 타입(Embedded Type)이란? (0) | 2023.08.08 |