Spring Data JPA의 복합키를 설정해보려고 한다.
말이 거창하게 복합키이지 쉽게 말하면 커스텀 키라고 생각하면 될 것 같다.
DataBase를 설계하다 보면 PK가 두개가 필요하거나 FK가 두개로 다른 Table과 연관될 때가 있다.
이럴때 복합키를 사용하여 Spring Data JPA에 연관관계를 표시할 수 있다.
복합키를 사용하는 방법은 @Embeddable Annotation과 @IdClass Annotation을 사용하는 방법이 있는데, 나는 @Embeddable Annotation을 이용하는 방법을 정리해보려고 한다.
@Embeddable Annotation을 사용하는 방법은 아주 단순하다.
/// 사용자의 연락처와 이름을 동시에 PK로 잡고 싶은 경우
@Data
@Embeddable
class UserCustomKey implements Serializeble {
@Column(name = "user_name")
private String userName;
@Column(name = "phone_number")
private String phoneNumber;
}
@Entity(name = "user_info")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class UserInfo {
@EmbeddedId
private UserCustomKey userKey;
}
복합키를 사용한 Spring Data JPA Repository 선언은 다음과 같다.
public interface UserInfoRepository extends JpaRepository<UserInfo, UserCustomKey> {
Optional<UserInfo> findByUserName(String userName);
Optional<UserInfo> findByPhoneNumber(String phoneNumber);
}
JPA를 처음 접할 때는 막연히 복합키가 너무 어렵고 @MapsId Annotation과의 응용도 힘들었는데 사용하다보니까 자연스럽게 익혀진거 같다. 연관관계에 관해서는 어느정도 이해가 된것같다.
JPA의 성능에 관해서도 기록을 해야될 것 같고 뒤쳐지지 않으려면 열심히 공부해야한다고 느끼고 있다.