728x90

 

JPA(Java Persistence API)에서 상속 관계를 매핑하는 것은 객체 지향 프로그래밍에서 자주 발생하는 상속 관계를 데이터베이스로 매핑하는 작업을 의미합니다.
이러한 상속 관계를 매핑하는 과정에서 "고급 매핑(Advanced Mapping)"을 사용할 수 있습니다. 고급 매핑은 다양한 상황에서 발생하는 복잡한 상속 구조를 처리하기 위한 JPA의 기능들을 말합니다.

 

상속관계 매핑

관계형 데이터 베이스는 상속관계가 아닙니다.

슈퍼타입 서브타입 관계라는 모델링 기법은 객체 상속과 유사합니다. 슈퍼타입 서브타입 관계는 데이터베이스에서 공통된 속성들을 슈퍼타입 테이블에 정의하고, 특정 속성들은 서브타입 테이블에 정의하는 기법입니다.

객체 상속은 객체 지향 프로그래밍에서 공통된 속성들을 슈퍼클래스에 정의하고, 특정 속성들은 서브클래스에 정의하는 기법입니다. 두 기법 모두 공통된 속성들을 정의하고, 특정 속성들은 특정 객체에만 정의하는 것이라는 점에서 유사합니다.

상속관계 매핑이라함은 객체의 상속 구조와 DB의 슈퍼타입, 서브타입 관계를 매핑하는 것입니다.

 


 

💡 DB에서의 논리적 모델과 물리적 모델

관계형 데이터베이스에서의 논리적 모델과 물리적 모델은 데이터베이스 설계의 두 가지 중요한 측면을 나타내는 개념입니다.

  • 논리적 모델 논리적 모델은 데이터베이스의 구조와 관계, 테이블의 스키마, 속성들의 정의 등을 나타내는 모델입니다. 이 모델은 데이터베이스 설계자가 비즈니스 요구사항을 분석하고, 데이터베이스의 구조를 추상적으로 설계할 때 사용됩니다. 논리적 모델은 데이터의 논리적 구성을 중심으로 설계되며, 엔터티, 속성, 관계 등의 개념을 포함합니다. 대표적인 논리적 모델로는 E-R 다이어그램(Entity-Relationship Diagram)이 있습니다.

논리적 모델은 데이터베이스 사용자와 관련이 깊은 측면으로, 데이터베이스의 구조를 어떻게 구성할지에 대한 개념적 설계를 의미합니다. 논리적 모델은 데이터베이스의 구조를 결정하고, 어떤 테이블이 어떤 속성을 가지며, 이들 간의 관계를 어떻게 설정할지를 정의합니다.

  • 물리적 모델 물리적 모델은 논리적 모델을 실제 데이터베이스 관리 시스템(DBMS)에 맞게 변환한 모델입니다. 이 모델은 데이터를 저장하고 검색하는 방식, 인덱스 사용 여부, 데이터 타입의 선택 등과 같은 물리적인 세부 사항을 나타냅니다. 물리적 모델은 데이터베이스 시스템의 성능, 확장성, 보안 등과 관련이 깊습니다.

물리적 모델은 실제로 데이터베이스 시스템 내에서 어떻게 데이터가 저장되고 관리되는지를 결정합니다. 이 모델은 인덱스의 생성, 파티셔닝 전략, 테이블 간의 조인 방식 등을 정의하며, 데이터베이스 성능과 최적화를 위한 중요한 요소입니다.

요약하자면, 논리적 모델은 데이터의 구조를 비즈니스 요구사항에 맞게 추상적으로 설계하는 것이고, 물리적 모델은 그 논리적 구조를 실제 DBMS에 맞게 변환하여 데이터의 저장과 관리 방식을 결정하는 것입니다.

 


 

연관관계 매핑 시 주로 사용되는 어노테이션

 

연관관계 매핑에서 주로 사용되는 어노테이션은 JPA(Java Persistence API)의 일부분으로, 객체 간의 관계를 매핑하는 데 사용됩니다. 아래에 언급된 어노테이션들은 주로 상속 관계와 관련된 매핑에서 사용되며, 엔터티 클래스 간의 상속 구조를 정의하고 데이터베이스 테이블 간의 매핑을 지원합니다.

  1. @Inheritance : 상속 관계 매핑을 위한 어노테이션입니다. 부모 엔터티 클래스에 이 어노테이션을 사용하며, 하위 엔터티 클래스들과의 관계를 정의할 때 사용합니다. EX ) @Inheritance(strategy = InheritanceType.JOINED)

  2. @DiscriminatorColumn : 상속 관계 매핑 시, 부모 클래스와 자식 클래스를 식별하는 데 사용할 컬럼을 지정하는 어노테이션입니다. 주로 부모 클래스에 사용되며, 자식 엔터티 클래스의 타입 정보를 저장하는 컬럼을 의미합니다. 연관관계를 맺은 테이블이 어떤 테이블인지 명시해주는 어노테이션입니다.

  3. @DiscriminatorValue : 하위 엔터티 클래스에서 사용되며, 데이터베이스 테이블의 discriminator 컬럼 값으로 사용됩니다. 부모 클래스의 @DiscriminatorColumn과 함께 사용하여 어떤 하위 클래스를 의미하는지 표시합니다.

  4. @MappedSuperclass : 부모 클래스가 테이블과 매핑되지 않고, 자식 클래스에게 매핑 정보만을 제공하기 위해 사용되는 어노테이션입니다. 상속 관계에서 부모 클래스의 공통 매핑 정보를 정의할 때 사용합니다.

 


✍️ 슈퍼타입 서브타입 논리 모델을 실제 물리모델로 구현하는 3가지 방법

 

 

  1. 한 테이블로 구현 (단일 테이블 전략) - @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 이 방법은 슈퍼타입과 서브타입을 하나의 테이블로 구현하는 방식입니다.
    테이블 내에 슈퍼타입과 모든 서브타입의 속성을 함께 저장합니다. 서브타입 특성에 대한 컬럼은 NULL을 허용하며, 슈퍼타입을 나타내는 컬럼을 통해 어떤 서브타입인지 구분합니다.

    단점 : NULL 값을 많이 가지게 되므로 저장 공간의 낭비가 발생할 수 있습니다. 서브타입마다 다른 속성을 가지기 때문에 데이터 중복이 발생할 수 있습니다.

    장점 : 하나의 테이블에 모든 데이터를 저장하여 JOIN 연산을 최소화하므로 조회 성능이 좋을 수 있습니다. 테이블 간의 관계가 없어서 데이터 정합성에 대한 걱정이 줄어듭니다.

 

🎈 단일 테이블 전략으로 관계 매핑 예제

 

 

           
           
           Item Entity 클래스

            @Entity
            public class Item {

                @Id @GeneratedValue
                private Long id;

                private String name; //상품명
                private int price; //상품 가격
            }

            Album, Book, Movie Entity 클래스
            1. @Entity
            public class Book extends Item {

                private String author;
                private String isbn;
            }

            2. @Entity
            public class Album extends Item {
                private String artist;
            }

            3. @Entity
            public class Movie extends Item {

                private String director;
                private String actor;
            }

 

 

 

728x90
반응형

+ Recent posts