JPA 를 통해 복합 키와 식별 관계 매핑에 대해서 공부하였다
예전에 졸업 작품으로 어플리케이션을 만들때, 스프링을 통해 JPA 를 사용하였고, 식별관계 매핑을 할 일이 있었는데 엄청 헤매였던 기억에 더욱 중점적으로 봤던 것 같다.
식별 관계 : 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계
비식별 관계 : 부모 테이블의 기본키를 받되, 자식테이블의 외래키로만 사용한다.
필수적 비식별 관계에는 외래키에 NULL 을 허용치 않으며 연관관계를 필수적으로 맺어야 한다. 선택적 비식별 관계에는 NULL 을 허용하며, 연관관계를 맺을지 말지 선택이 가능하다.
JPA 는 복합 키 지원을 위해 @IdClass 나 @EmbeddedId 2가지 방법을 지원한다. @IdClass 는 관계형 데이터 베이스에 가까운 방법이고, @EmbeddedId 는 좀 더 객체 지향에 가깝다고 한다.
@EmbeddedId 를 적용한 식별자 클래스는 식별자 클래스에 기본 키를 직접 매핑한다.
@IdClass 에서 식별관계를 매핑할때는 식별자 매핑인 @Id 와 연관관계 매핑인 @ManyToOne 등을 같이 사용한다.
@EmbeddedId 에서는 @MapsId 를 사용해야 한다. @MapsId 는 외래키와 매핑한 연관계를 기본 키 에도 매핑하겠다는 뜻이다.
식별관계와 비식별 관계의 장단점을 따져보자면
식별관계는 기본 키 인덱스를 활용하기가 좋고, 자식, 손자 테이블들이 상위 테이블의 기본 키 칼럼을 가지고 있으니 조인 없이 하위 테이블만으로도 검색할 수 가 있다. 하지만 테이블 구조가 유연하지 못하고, 일대일 관계를 제외하고는 복합 기본키를 보통 사용하고, 이런 복합 키 클래스를 이용해 구성하는 것은 칼럼이 하나인 기본키를 매핑하는 것 보다 많은 노력이 필요하다.
두 가지 방법을 적절하게 병행하여 사용하는 것이 매우 바람직하겠다. 하지만 여기서 제일 추천 되는 방법은 비식별 관계를 사용하며 기본 키를 Long 타입의 대리 키를 사용하는 것이다. Long 타입의 대리 키는 비즈니스와 아무 관련이 없다. 그렇기 때문에 유연한 대처가 가능하다.
여러 대처법 들과 식별 관계와 비식별 관계의 장단점과 활용법에 대해서 공부하였다. 확실히 이러한 점들을 졸업 작품 전에 공부를 더 했으면 좀 더 효율적으로 테이블 매핑을 진행했을 것 같다. 실제로 과제 때도 이런식으로 연관 매핑을 했었는데 이러한 점을 너무 고려 하지 않은 탓에 난잡한 코드가 되어 기분이 좋지 못했다.
활용 도서 : 자바 ORM 표준 JPA 프로그래밍 김영한 지음
'TIL' 카테고리의 다른 글
2025. 03. 02 (0) | 2025.03.02 |
---|---|
2025. 02. 16 (1) | 2025.02.16 |
2024. 12 .01 (0) | 2024.12.01 |
2024. 11. 24 (1) | 2024.11.24 |
2024. 11. 17 (0) | 2024.11.17 |