안녕하세요. 씨엔스 입니다.
JPA를 사용하여 Entity 를 만들때 공통적으로 사용되는 컬럼들을 중복해서 사용하지 않고 상속받아 사용할 수 있도록 도와주는 MappedSuperClass 어노테이션에 대해 알아보려고 합니다.
테이블을 생성할 때 공통적으로 사용되는 컬럼들이 존재하고 이를 매번 Entity에 포함하는 경우 코드가 중복되는 경우가 생깁니다.
이때 @MappedSuperClass 를 사용하여 중복되는 코드를 줄이고 공통된 객체를 상속받아 매핑할 수 있습니다.
위 이미지는 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 |