ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 복합키(Composite key)란?
    스파르타코딩클럽/스프링 팀 프로젝트 - Back Office 2023. 12. 7. 20:52

     

     

     

    복합키

    "두 개 이상의 열(column)을 결합하여 하나의 특별한 키로 만든 것"

     

     

    특징

    1. 각각의 키가 유일하지 않을 경우 여러 키를 결합하여 행의 유일성 보장

    2. RDB에서 주로 사용되며, 연결테이블에서 많이 사용된다.

    3. 종종 FK와 결합되어 사용되며, 두 테이블간의 관계를 보다 명확하게 표현 가능

     

     


     

     

    간단히 내가 이해한것을 써보자면

    복합키는 PK가 여러개이다.

    그래서 DB는 여러개의 PK를 가진 객체가

    서로 같은것인지 확인하기 위해

    PK를 객체(=구현체)로 묶어서 확인한다.

     


     

     

    프로젝트 내에서 Follow를 구현하기 위해

    처음에 복합키를 고려하였다.

     

    @Entity
    @Getter
    @RequiredArgsConstructor
    @IdClass(FollowID.class)
    public class Follow {
    
        @Id
        @Column
        private Long followerId;
    
        @Id
        @Column
        private Long followingId;
    
    
        public Follow(FollowID followID) {
            this.followerId = followID.;
            this.followingId = followID.;
        }
    }

     

    복합키는 JoinColumn을 달지 않는다.

     

    대신 @IdClass(FollowID.class)  클래스를 생성하여 이 클래스의 각 필드와 엔티티를 매핑한다.

     

    다른방법도 있으나 나는 이 방법을 사용하여 복합키를 만들었다.

     

    @NoArgsConstructor
    @AllArgsConstructor
    public class FollowID implements Serializable {
    
        private Long followerId;
        private Long followingId;
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if(!(obj instanceof FollowID )) return false;
            FollowID followID = (FollowID) obj;
    
            return Objects.equals(followerId, followID.followerId) &&
                    Objects.equals(followingId, followID.followingId);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(followerId, followingId);
        }
    }

     

    그리고 여기서는 각 PK를 합친 객체를 비교해야하므로 

     

    equals를 오버라이딩해야하며,  equals를 오버라이딩하기 때문에 hashcode도 오버라이딩 해야한다.

     

     


     

     

    복합키를 사용할 때 주의해야 할 점은

    순환참조이다.

    진짜 모든 곳에서 발생한다.

     

    그리고 파라미터 변수를 잘 관리해야 

    엔티티에서 생성자를 작성할때 애먹지 않는다.

     

     

Designed by Tistory.