본문 바로가기
Framework and Tool/JPA

JPA - 고급맵핑 - MappedSuperclass

by ocwokocw 2021. 7. 10.

- 참조: 자바 ORM 표준 JPA 프로그래밍

- @MappedSuperclass

앞에서 살펴본 슈퍼타입과 서브타입에서는 부모 클래스와 자식 클래스를 모두 테이블과 맵핑했다. @MappedSuperclass 를 이용하면 부모 클래스는 테이블과 맵핑하지 않고, 상속 받는 자식 클래스에게 맵핑 정보만 제공할 수 있다. 즉 @Entity 는 실제 테이블과 맵핑되지만 @MappedSuperclass 는 실제 테이블과 맵핑되지 않는다.

위와 같이 MEMBER 와 SELLER 테이블이 있지만, MEMBER 와 SELLER 는 비즈니스적인 관계가 없다고 가정하자. 관계는 없지만 ID 와 NAME 을 공통된 속성으로 사용하고 싶을 때가 있다.

이를 UML 로 표현해보면 위와 같이 된다. BaseEntity 에 id, name 속성이 있으며 이를 상솓받는 Member, Seller 가 있다.

 

@MappedSuperclass
public abstract class BaseEntity {

	@Id @GeneratedValue
	private Long id;
	private String name;

............

@Entity
@AttributeOverrides({
	@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID")),
	@AttributeOverride(name = "name", column = @Column(name = "MEMBER_NAME"))
})
public class Member extends BaseEntity {

	private String email;

...........

@Entity
public class Seller extends BaseEntity {

	private String shopName;

 

부모 클래스에 해당하는 BaseEntity 에 @MappedSuperclass 어노테이션을 붙여준다. Member 와 Seller 는 이를 상속하기만 하면 BaseEntity 의 속성들이 추가된다.

 

Member 엔티티에서 @AttributeOverrides 어노테이션이 보이는데, 이는 부모의 맵핑 정보를 재정의 하기 위함이다. 단일 건일 경우 @AttributeOverride 를 사용하면 된다.

 

public static void save(EntityManager em) {
	
	EntityTransaction tx = em.getTransaction();
	tx.begin();
	
	Member member = new Member();
	member.setName("NAME#1");
	member.setEmail("EMAIL#1");
	em.persist(member);
	
	Seller seller = new Seller();
	seller.setName("NAME#2");
	seller.setShopName("SHOP_NAME#1");
	em.persist(seller);
	
	tx.commit();
	em.close();
}

 

위와 같이 테스트 코드를 작성하여 테이블을 조회해보자.

MEMBER 테이블은 어노테이션을 통해 맵핑 정보를 재정의한대로 MEMBER_ID 와 MEMBER_NAME 으로 컬럼이름이 변경되었다. 반면 SELLER 는 부모의 ID 와 NAME 컬럼을 그대로 이용한다.

 

@MappedSuperclass 는 엔티티가 아니므로 em.find 나 JPQL 에서 사용할 수 없다. @Inheritance 와 비슷한것 같지만 둘의 사용용도는 다르다. @Inheritance 는 슈퍼타입과 서브타입 관계를 맵핑하는것이지만 @MappedSuperclass 는 엔티티들이 사용하는 공통 속성들을 모아놓은것일 뿐이다.

 

보통 현업에서는 insert_date, insert_user_id, update_date, update_user_id 와 같이 공통적인 컬럼들을 정의해서 @MappedSuperclass 를 사용하기도 한다.

댓글