[Spring JPA] @MappedSuperClass 란?

최동근·2023년 2월 7일
0

JPA

목록 보기
6/13
post-custom-banner

안녕하세요 오늘은 @MappedSuperClass 에 대해 알아보겠습니다 👨‍💻

해당 포스팅을 읽기 전 JPA 프로그래밍 Entity Mapping 3편[상속관계 매핑] 을 참고해주세요!

🎒 기본적인 상속관계 매핑

Spring JPA 는 객체와 데이터베이스의 테이블을 매핑해주는 기능(ORM)을 제공합니다.
이때 둘 사이의 패러다임의 불일치 문제로 인해 제약이 생기는데 Spring JPA 는 이런 문제를 효과적인 방법으로 해결해줍니다.
이번 포스팅에서 주목해야할 부분은 상속 관계 매핑입니다 🤔
객체 지향 프로그래밍에서 상속 은 핵심적인 기능을 합니다. 하지만 Spring JPA 를 통해 매핑할 데이터베이스에는 상속 이라는 개념이 존재하지 않습니다. 불행 중 다행으로 슈퍼 타입 - 서브 타입 개념이 존재합니다. Spring JPA 는 데이터베이스에 존재하지 않는 상속 이라는 개념을 슈퍼타입 - 서브타입 으로 해결합니다.

상속관계 매핑 전략에는 3가지가 존재합니다.

  • 조인 전략
  • 단일 테이블 전략
  • 구현 클래스마다 테이블 전략

이 3가지 방식은 각각 다른 전략을 통해 객체의 상속 방식을 데이터베이스의 테이블에 알맞게 매핑시킵니다.
각 전략은 조금씩 차이가 있지만 부모 클래스 또한 테이블로 매핑시킨다는 공통점이 있습니다 🧑🏼‍💻
하지만 어떠한 경우에는 부모 클래스를 테이블로 매핑 시킬 필요 없이 칼럼 정보만 매핑 정보로 필요한 경우가 있습니다.
여기서 우리는 @MappedSuperClass 를 사용할 수 있습니다 ❗️

🎒 @MappedSuperClass 에 대해

앞에서 잠시 언급했던 것처럼 부모 클래스는 테이블과 매핑하지 않고, 오로지 부모 클래스를 상속 받는 자식 클래스에게 부모 클래스가 가지는 칼럼만 매핑정보로 제공하고 싶다면 @MappedSuperclass 를 사용하면 됩니다.
간단한 예제를 통해 @MappedSuperClass 를 완벽하게 이해해 봅시다 ✅

해당 그림은 MemberSeller 엔티티 클래스를 나타내는 이미지 입니다.
여기서 우리는 두 엔티티는 서로 연관이 없다는 것과 각 엔티티가 ID, Name 속성을 공통으로 가지고 있는 것을 확인할 수 있습니다 🙆🏻
이때 공통된 두 칼럼 IDName 을 부모 클래스로 모으고 객체 상속 관계로 만들어보겠습니다.

해당 이미지는 저희가 의도한 것처럼 두 공통된 칼럼을 하나의 부모 클래스로 모으고 객체 상속 관계로 만든 결과를 나타내는 이미지입니다 🧑🏼‍💻
이때 부모 클래스인 BaseEntity 는 자식들에게 상속을 통해 칼럼 정보를 제공하는 역할을 할 뿐입니다. 즉, BaseEntity 를 테이블로 매핑할 필요가 없고 칼럼 정보만 자식에게 제공해주면 됩니다.
이를 @MappedSuperclass 어노테이션을 이용해서 코드로 나타내보겠습니다.

@MappedSuperClass // @Entity 대신 사용
public abstract class BaseEntity { 
	
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    
    ...
}

-----------------------------------

@Entity
public class Member extends BaseEntity {
	
    // ID, name 상속받음
    private String email;
    
    ...
}

@Entity
public class Seller extends BaseEntity {

	// ID, name 상속받음
    private String shopName;
	
    ...
}

앞에서 언급했던 것처럼 부모 클래스인 BaseEntity 는 테이블로 매핑할 필요가 없습니다.
이를 위해 @Entity 어노테이션 대신 @MappedSuperClass 를 사용하면 됩니다.
실제로 @MappedSuperclass엔티티 리스너와 함께 등록일자, 수정일자, 등록자, 수정자와 같은 모든 테이블에 공통으로 필요한 칼럼을 효과적으로 관리하는데에 자주 사용됩니다 👍

@MappedSuperclass 를 사용하는 것은 ORM에서 이야기 하는 진정한 상속 매핑과는 차이가 있기 때문에 상속 매핑과 동일하게 생각하면 안됩니다 ⛔️
또한 엔티티 클래스는 @Entity 와 @MappedSuperclass 가 선언된 클래스만 상속할 수 있습니다 ❗️


참고

[JPA] @MappedSuperclass

profile
비즈니스가치를추구하는개발자
post-custom-banner

0개의 댓글