MappedSuperclass

 

 

개념

핵심부터 말하자면, 객체는 상속관계에 있으나 테이블은 상속관계 매핑이 아닐 때 사용한다.

 

논리적으로 상속 관계에 있는 엔티티 클래스 간에 매핑 관계를 만드는게 아니라,

단순히 공통된 매핑 컬럼을 하나의 부모 객체 안에 몰아넣고자 할 때 사용하는 어노테이션이다.

 

Member와 Seller 테이블이 있다.

 

이 두 테이블은 공통적으로 id와 name을 공통 속성으로 갖는다.

 

우리는 이 두 속성을 부모 객체에 할당하고자 하는거다.

 

지금은 두 테이블밖에 없지만 만약 테이블이 수십개가 넘어간다고 가정해보자.

 

그리고 공통된 속성은 id와 name에서 그치는 것이 아니라 등록일자, 수정일자, 등록한 사람,  수정한 사람 등등 점점 늘어난다고 가정하자.

 

그때마다 모든 엔티티 클래스에 가서 컬럼을 추가할 것인가?

 

이런 번거로움을 해결하기 위해 자바에는 아주 유용한 상속관계 extends라는 게 존재한다.

 

주의할 건 처음에 언급했듯이 객체간에만 상속관계를 맺는다.

 

그리고 공통된 속성을 엔티티 클래스로 가져와 각각의 테이블을 만들 때 "이용"하는 것이지,

실제 만들어지는 테이블끼리는 아무런 관계도 아니다.

 

심지어 부모 객체는 @Entity도 선언하지 않는 단순 객체로 통한다.

 

 

 

사용 방법

먼저, 공통 속성을 담을 부모 객체를 만들고 MappedSuperclass를 붙이자.

 

단순히 공통 속성을 담을 객체일 뿐이다.

 

Entity도 필요 없고, 왠만해서는 이 클래스를 사용하기위해 직접 호출하는 일도 없을것이다.

 

그렇다면 추상클래스로 만드는게 바람직한 경우가 많을 것이다.

@Getter @Setter
@MappedSuperclass
public abstract class CommonBox {
    private String id;
    private String name;
}

 

 

그리고 우리가 실제 필요한 Member 테이블과 Seller 테이블을 만들고 부모 클래스를 상속받아주자.

 

이 두 테이블은 실제 존재하는 테이블이니 Entity로 등록한다.

@Entity
@Getter @Setter
public class Member extends CommonBox {
    private String email;
}
@Entity
@Getter @Setter
public class Seller extends CommonBox {
    private String shopName;
}

 

 

 

객체를 만들고 공통속성의 상속관계를 맺어주었다면 우리가 잘 아는 방식으로 테이블을 만들어주면 된다.

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction ts = em.getTransaction();
        ts.begin();
    
        Member member = new Member();
        member.id("ABC");
        member.name("홍길동");
        member.email("ABC@gmail.com");
        em.persist(member);

        Seller seller = new Seller();
        seller.id("1234");
        seller.name("1234SHOP");
        seller.shopName("1234@gmail.com");
        em.persist(seller);
	}	
}

 

 

참고로 엔티티 클래스가 어떤 클래스를 상속받으려면 상속의 주체가 되는 부모 클래스에 @Entity가 붙거나 @MappedSuplerclass가 붙거나 둘 중 하나는 있어야 한다는 사실도 알아두자.

 

여기까지 내용을 토대로 하여 경우에 따른 사용 예시를 들어보겠다.

 

 

상황 예시

1. 아이템의 종류는 전자기기, 신발, 가구가 있고 이후 더 확장될 수 있다.
2. 모든 테이블은 name과 price를 공통 속성으로 갖는다.

 

두 상황에서 상속관계 매핑과 MappedSuperclass는 어떻게 활용해야 할까?

 

  정답  

더보기

1번 상황에서 상속관계 매핑을, 2번 상황에서 MappedSuperclass를 사용해야 한다.

 

먼저, 공통 속성 클래스를 만들고 @MappedSuperclass로 등록해준다.

 

그리고 [아이템] - [전자기기,신발,가구] 테이블 간 상속관계 매핑에서 슈퍼클래스가 되는 아이템 클래스가 우리가 위에서 다룬 방식대로 공통 속성 클래스를 상속받도록 만들어 준다.

 

마지막으로 전가기기, 신발, 가구 테이블에 아이템 클래스와 상속관계 매핑을 맺어주자.

 

여기서 말하는 상속관계 매핑은 오늘 다룬 MappedSuperclass와 다르다는 점에 주의하자.

 


MappedSuperclass는 어떻게 사용하는지 알겠어.
그래서 자꾸 상속관계 매핑은 뭔데??

 

라는 궁금증이 생긴다면, 상속관계 매핑을 공부하고 오자. (추후 관련 글도 올려보겠다.)

MappedSuperclass와 상속관계 매핑은 서로가 서로를 공부하는데 많은 도움이 될 것이다.

 

 

 

 

엔티티 테이블 설계에서 편리하게 쓰이는 MappedSuperclass에 대해 알아보았다. 

 

 

 

 

복사했습니다!