유니크 값 없는 테이블을 JPA Entity 연결하기

CASE 1 : SPRING BOOT , JPA 프로젝트 에서 이미 존재하는 오라클 디비 와 엔티티 매칭 하는 로직

기존에는 따로 디비를 만들지 않고 프로젝트 안에서 기재한 엔티티를 바탕으로 DB 테이블을 생성해서 사용하여서 해당 로직은 처음 접해봤다.

  • 도메인 파트

@Entity : 필수이다. 해당 클래스가 객체이며 DBMS 와 연결해야 한다는 사인이므로!

@Getter : 스프링 안에서 구동될때 get 이 없으면 오류가 나는걸로 알기에 넣었다.

@NoArgsConstructor : 생성자 생성을 위해서 삽입

@Immutable : 오라클의 뷰테이블을 매칭 하는것인데 뷰테이블 이기도 하고 해당 데이터는 read-only 이기 때문에 삽입

@Table : 아주 중요하다. 어떤 테이블에 매칭할것인지 명시해야하는 어노테이션이다. 처음에 테이블 명을 잘 못 명시해 오류가 났다.

@Id : JPA 에서 객체는 무조건적으로 유니크값 즉 @Id 를 가지고 명시해야한다.

처음에 GRP_CD 를 ID 로 잡고 출력하니 동일한 CD 를 가진 컬럼은 컬럼값이 CD 를 가진 여러 컬럼 중 첫 번째 컬럼값으로만 출력되는 오류를 냈다. 고로 유니크값을 ID 로 잡아서 출력하니 정상 출력 되었다.

위 같은 방법으로 해결이 되었다고 생각했지만 결과를 자세히 살펴보니 유니크값을 가진다고 생각했던 컬럼이 유니크값이 아니여서 정상 출력되지 않았다.

그 어떤 컬럼도 @ID 로 잡을수없다고 판단 한 뒤 복합키 라는 것을 사용했다.

말그대로 여러 컬럼을 한데 모아 그 자체를 키로 사용하는것이다.

컬럼 각각은 유니크 하진 않지만 로우는 그 자체로 유니크하기 때문에 로우 하나를 통채로 복합키로 잡고 진행하였다.

@Getter
@Embeddable
public class CompositeKey implements Serializable {    
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

위 같이 만들어줬고 클래스는 기존 엔티티 클래스 와 동일하게 작성하였다.

public class Entity {

    @EmbeddedId
    private CompositeKey compositeKey;

}

Last updated