티스토리 뷰

Java/JPA

<JPA> @MappedSuperclass 이란?

면목동인간 2024. 9. 5. 15:25

@MappedSuperclass 이란?

 객체들 간에 공통된 필드가 있을 때 @MappedSuperclass 객체를 상속받아서 이런 공통된 필드를 매핑해 준다. 예를 들어 여러 테이블에 생성자 ID, 생성 시간, 수정자 ID, 수정 시간의 속성이 필요하다면 객체마다 공통된 필드를 일일이 선언하는 것이 아닌 @MappedSuperclass 객체를 상속받으면 해결된다.

 

예제

 아래 예제에서  두 개의 게시판 객체가 있는데 두개의 게시판은 생성자 ID, 생성 시간, 수정자 ID, 수정 시간의 공통 필드가 존재한다. 두 개의 게시판 객체를 @MappedSuperclass 선언된 객체를 상속받기 전과 후로 테스트해보았다.

 

@MappedSuperclass 선언 전

@Entity
public class Board1 {

    @Id
    @GeneratedValue
    private Long id;

    private String createdId;
    private LocalDateTime createDate;
    private String modifyId;
    private LocalDateTime modifyDate;
}
@Entity
public class Board2 {

    @Id
    @GeneratedValue
    private Long id;

    private String createdId;
    private LocalDateTime createDate;
    private String modifyId;
    private LocalDateTime modifyDate;
}
Hibernate: 
    create table Board1 (
        createDate timestamp(6),
        id bigint not null,
        modifyDate timestamp(6),
        createdId varchar(255),
        modifyId varchar(255),
        primary key (id)
    )
Hibernate: 
    create table Board2 (
        createDate timestamp(6),
        id bigint not null,
        modifyDate timestamp(6),
        createdId varchar(255),
        modifyId varchar(255),
        primary key (id)
    )

 두 개의 객체를 엔티티로 선언 후 실행한 결과 테이블이 정상적으로 생성되었다.

 

@MappedSuperclass 선언 후 객체 상속

@MappedSuperclass
public abstract class BoardCommonMapping {

    private String createdId;
    private LocalDateTime createDate;
    private String modifyId;
    private LocalDateTime modifyDate;

}

 위의 @MappedSuperclass으로 선언된 객체를 보면 Board1, Board2의 공통 필드인 생성자 ID, 생성 시간, 수정자 ID, 수정 시간이 있다는 걸 확인할 수 있다. 이제 Board1, Board2의 객체를 @MappedSuperclass으로 선언 된 객체 상속받으면 아래와 같다.

@Entity
public class Board1 extends BoardCommonMapping{

    @Id
    @GeneratedValue
    private Long id;
}
@Entity
public class Board2 extends BoardCommonMapping{

    @Id
    @GeneratedValue
    private Long id;
}
Hibernate: 
    create table Board1 (
        createDate timestamp(6),
        id bigint not null,
        modifyDate timestamp(6),
        createdId varchar(255),
        modifyId varchar(255),
        primary key (id)
    )
Hibernate: 
    create table Board2 (
        createDate timestamp(6),
        id bigint not null,
        modifyDate timestamp(6),
        createdId varchar(255),
        modifyId varchar(255),
        primary key (id)
    )

 위의 실행 결과를 확인해 보니 위와 같이 문제없이 정상적으로 생성되었다. 다만 BoardCommonMapping의 객체는 테이블이 생성되지 않았다. 참고로 BoardCommonMapping 객체는 추상 클래스로 선언했는데 그냥 클래스로 선언해도 상관은 없다. 하지만 BoardCommonMapping 객체를 생성을 방지하기 위해서 추상 클래스로 선언한 것이다. 

 

정리

 @MappedSuperclass으로 선언된 객체는 엔티티랑 테이블과 무관하며, 상속받은 자식 클래스에 매핑 정보(객체의 필드, 테이블의 속성)만 제공해 준다. 따라서 em.find( @MappedSuperclass 선언된 객체)으로 조회, 검색이 불가하며, 전체 엔티티에서 공통으로 필요한 필드를 매핑할 때 사용한다.

 


본 포스팅은 “자바 ORM 표준 JPA 프로그래밍 - 기본 편/인프런”를 학습한 내용을 정리한 것

댓글
최근에 올라온 글
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
Total
Today
Yesterday