본문 바로가기
에러 기록

스프링 JPA 과 pk값이 여러 컬럼인(복합키) 테이블 연결하기 - jpa

by 샤샤샤샤 2024. 2. 28.

DB와 연결 스프링간의 연결을 쉽게 만들어주는 JPA는 일반적으로 다음과 같이 사용한다.

 

1. DB의 테이블을 나타내는 Entity 클래스 생성. 컬럼값을 값으로 받기 위한 필드값을 생성해야 한다.

2. JpaRepository 인터페이스를 상속받는 인터페이스를 생성한다.

3. JpaRepository 제네릭에 1에서 생성한 엔티티 클래스와 pk와 연동되는 필드값의 데이터 타입을 입력한다.

 

그러나 pk값이 하나의 컬럼으로 설정된 테이블이 아닌, 여러 컬럼이 합쳐진 형태로 존재하는 테이블은 1번 엔티티 클래스 생성부터 방식이 다르다.

 

1. 엔티티 클래스 생성

기존에 pk값은 Long 이나 String 같은 기본 타입으로 표현 가능했으나, 컬럼이 여러개로 이뤄진 pk값은 이것이 불가능하다. 따라서 pk값을 표현하기 위한 아예 새로운 타입, 즉, 아예 새로운 클래스를 생성해야 한다. 이를 위한 어노테이션 @Embeddable 이 존재한다.

 

@Getter
@Entity
@Table(name = "meeting")
@NoArgsConstructor
public class Meeting {

    @EmbeddedId
    private MeetingId id;
    private String bookTitle;
    private String joinMember;
    private String online;
    private LocalDate meetingDate;
    private LocalTime meetingTime;
    private int max;

    @Embeddable
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @EqualsAndHashCode
    public static class MeetingId implements Serializable {
        private Long no;
        private Long clubNo;
    }
}

 

이때 @Embeddable 이 붙은 클래스는 하이버네이트상 컴포턴트가 된 클래스로, 간단하게 표현하자만 복합키라는 것을 표현하기 위한 어노테이션이다. 추후 이 값이 사용되는 필드가 pk값이라면 @EmbededId를, fk 값이라면 @Embeded 를 붙이면 된다.

 

Serializable 는 직렬화를 위해 상속받았다.

 

현재 MeetingId 클래스는 Meeting의 내부 클래스로 생성되었기에 Meeting 을 참조할때 문제가 생기지 않기 위해 static 키워드를 붙여주었다. 또한 생성자 함수를 만들어 옳바르게 매핑될수 있도록 해줬다.

 

2.  jpa 인터페이스 생성

@Repository
public interface MeetingRepository extends JpaRepository<Meeting, Meeting.MeetingId> {
}

 

id값으로 내부 클래스 타입을 지정해준다.

 

 

 

이로서 정상적으로 DB 와 연동이 되는 것을 확인할수 있다.