안녕하세요. 씨엔스 입니다.

JPA를 사용하여 Entity 를 만들때 공통적으로 사용되는 컬럼들을 중복해서 사용하지 않고 상속받아 사용할 수 있도록 도와주는 MappedSuperClass 어노테이션에 대해 알아보려고 합니다.

테이블을 생성할 때 공통적으로 사용되는 컬럼들이 존재하고 이를 매번 Entity에 포함하는 경우 코드가 중복되는 경우가 생깁니다.

이때 @MappedSuperClass 를 사용하여 중복되는 코드를 줄이고 공통된 객체를 상속받아 매핑할 수 있습니다.

Board 와 Comment Entity 사이의 공통 속성 객체 BaseSystemFieldEntity 구조

위 이미지는 Board와 Comment라는 두개의 Entity 사이에서 공통적으로 사용되는 속성 객체를 BaseSystemFieldEntity라는 부모로 사용하는 구조를 표현하였습니다.

이를 간단한 소스코드로 표현하자면

 

> BaseSystemFieldEntity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass // @Entity 대신 사용한다.
public class BaseSystemFieldEntity {
    @Column(name = "register_id", updatable = false)
    private String registerId;
    @Column(name = "regist_dt", updatable = false)
    private LocalDateTime registDt;
    @Column(name = "updusr_id")
    private String updusrId;
    @Column(name = "updt_dt")
    private LocalDateTime updtDt;
 
    ...
}
 
cs          

 

> Board

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Entity
public class Board extends BaseSystemFieldEntity {
    @Id
    @Column(name = "bbs_id")
    private String bbsId;
    @Column(name = "bbs_sj")
    private String bbsSj;
    @Column(name = "bbs_cn")
    private String bbsCn;
    @Column(name = "use_at")
    private String useAt;
}
cs

 

> Comment

1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
public class Comment extends BaseSystemFieldEntity {
    @Id
    @Column(name = "cmnt_id")
    private String cmntId;
    @Column(name = "bbs_id")
    private String bbsId;
    @Column(name = "cmnt_cn")
    private String cmntCn;
}
cs

 

BaseSystemFieldEntity 클래스는 테이블로 매핑할 필요가 없고 @Entity 어노테이션 대신 @MapperSuperClass 을 사용하면됩니다.

또한 @Entity 어노테이션을 사용한 클래스에 BaseSystemFieldEntity 클래스를 상속받아 사용합니다.

하지만 @MapperSuperClass 이 ORM의 상속 관계와는 달리 자식 클래스의 매핑정보만 제공하는 역할이기 때문에 테이블과는 관련이 없습니다. 즉, 테이블과는 관계가 없다는 단순 매핑 역할일 뿐입니다.(@Entity 사용X) 

그렇기에 직접 생성해서 사용할 일이 없으므로 추상 클래스로 사용하는 것을 권장합니다.

'Language > Java' 카테고리의 다른 글

[Swagger docs]Spring 3.x.x 버전에서 swagger 사용법  (1) 2023.12.27
[Java] Null 체크를 위한 방법  (1) 2022.03.31

+ Recent posts