본문 바로가기
Back-end/JPA 개념

13. @MappedSuperClass

by devraphy 2022. 4. 7.

0. 개요

- 이번 포스팅에서는 @MappedSuperClass라는 기능에 대해서 알아보자.

 

1. @MappedSuperClass

- @MappedSuperClass는 공통 매핑 정보를 필요로 할 때 사용하는 기능이다.

- 이는 상속 관계 매핑과 DB와는 별도의 기능으로, 객체의 관점만 집중하는 기능이다.

 

a) @MappedSuperClass란?

- 모든 Entity에 동일한 필드가 존재하는 경우, 이를 Entity를 정의할 때마다 중복적으로 작성한다.

- 이러한 중복 필드를 공통으로 관리하여 중복적인 작성을 방지하는 기능이다.

 

b) 예시 코드

- 다음 예시 코드를 통해서 @MappedSuperClass의 역할을 이해해보자.

@Entity
public class A {

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

 

@Entity
public class B {

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

 

- 위의 코드처럼, 모든 Entity가 id와 name이라는 공통 필드를 가진다고 해보자.

- Entity가 100개가 있다면 id와 name이라는 필드를 100번씩 작성해야 한다.

- 이처럼 중복적으로 등장하는 필드를 공통으로 관리하기 위해 @MappedSuperClass를 사용한다.

 

- 다음 코드를 살펴보자.

@MappedSuperclass
public class BaseEntity {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    
    // Getter & Setter 까지 필수로 입력해야 한다.
    // 여기서는 생략하였다.
}

 

@Entity
public class A extends BaseEntity{}

 

@Entity
public class B extends BaseEntity{}

 

- 위의 코드에서 주목해야 하는 부분은 BaseEntity 클래스다.

- 중복적으로 작성되는 필드를 공통 관리하는 클래스를 생성하고, @MappedSuperClass를 명시한다.

- 이처럼 BaseEntity를 상속받는 모든 Entity는 공통 필드를 따로 작성하지 않아도 된다.

 

* 주의하자!!!

- 공통 필드를 관리하는 BaseEntity 클래스에는 반드시 Getter와 Setter를 포함해야 한다.

- 위의 예시 코드에서는 가독성을 위해 생략하였다.

 

c) 예시 코드 실행

- 다음 코드를 이용하여 위의 예시 코드를 테이블로 생성해보자.

 

- 위의 코드를 보면 Getter & Setter까지 공통 필드로 관리되는 것을 확인할 수 있다.

- 이를 실행하면 다음과 같은 DDL 쿼리가 생성되는 것을 확인할 수 있다.

 

- 위의 사진에서 확인할 수 있듯이, 공통 필드인 id와 name이 테이블에 자동으로 생성되었다.

- 그렇다면 DB에는 올바르게 값이 들어갔을까? 다음 사진을 살펴보자.

 

-  위의 사진처럼 DB에 올바르게 값이 생성된 것을 확인할 수 있다.

 

d) 정리 및 결론

- @MappedSuperClass는 Entity에 중복 등장하는 필드를 공통으로 관리하는 기능이다.

- @MappedSuperClass는 상속 관계 매핑도 아니고 테이블 매핑도 아니다.

- 상속 관계 매핑이 아니므로 BaseEntity(상위 타입)를 이용한 조회는 불가능하다. 

- DB와는 별개로 오직 객체 중점적으로 동작하는 기능이다.

 

- BaseEntity를 인스턴스로 생성하여 사용할 일이 없으므로 추상 클래스(abstract)로 선언할 것을 권장한다.

 

* 헷갈리지 말자!!!

- @Entity가 선언된 클래스를 상속(extends) 받으면 상속 관계 매핑이 된다.

- @Entity 없이, @MappedSuperClass가 선언된 추상 클래스를 상속(extends) 받으면 공통 속성 매핑이다. 

 

 

 

댓글