[Spring Boot] JPA 강의 정리-15 (MappedSuperclass)

Posted by 김성철

SpringBoot - JPA 강의 정리-15(MappedSuperclass)

@MappedSuperclass

※ 상속관계 매핑과는 크게 관계가 없음  
공통 매핑 정보가 필요할 때 사용 (id , name)  
속성을 쓰고 싶을 때 사용함  
  
상속관계 매핑이 아님  
엔티티 아님  
테이블과 매핑 아님  
부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공  
조회, 검색 불가  
	ex) em.find(BaseEntity) 불가  
직접 생성해서 사용할 일이 없으므로 추상 클래스 권장  
  
- 정리  
	테이블과 관계가 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할  
	주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용  
	실제 운영에서도 많이 사용함  
  
- 참고  
	@Entity 클래스는 엔티티나 @MappedSuperclass 로 지정한 클래스만 상속 가능  

공통 매핑 정보?

Member 테이블의 ID , NAME  
Seller 테이블의 ID , NAME  
DB에서는 완전 다른 테이블이지만 객체 입장에서는 속성만 상속받아서 사용하고 싶을 때  

예시

- DBA가 모든 테이블에는 createdBy , createdDate , lastModifiedBy , lastModifiedDate 컬럼이 있어야 한다고 할때  
- 모든 Class 에 해당 필드들을 추가해야 할 때  
  
BaseEntity 클래스를 생성하여 사용할 클래스들에서 해당 BaseEntity 클래스를 상속 받으면 됨  
@MappedSuperclass 어노테이션을 추가해줘야 함  
  
=====================================================================  
SELECT * FROM MEMBEr;  
MEMBER_ID  	CREATEDBY  	CREATEDDATE  	LASTMODIFIEDBY  	LASTMODIFIEDDATE  	USERNAME  	LOCKER_ID  	TEAM_ID  
1	KIM SUNGCHUL	2023-05-12 01:02:09.123969	null	null	user1	null	null  
=====================================================================  
  
BaseEntity class  
=====================================================================  
@MappedSuperclass  
public abstract class BaseEntity {  
	private String createdBy;  
	private LocalDateTime createdDate;  
	private String lastModifiedBy;  
	private LocalDateTime lastModifiedDate;  
}  
=====================================================================  
  
Member class  
=====================================================================  
@Entity //필수  
public class Member extends BaseEntity{  
	......  
}  
  
=====================================================================  
  
어플리케이션 실행시 쿼리문  
=====================================================================  
create table Member (  
   MEMBER_ID bigint not null,  
    createdBy varchar(255),  
    createdDate timestamp,  
    lastModifiedBy varchar(255),  
    lastModifiedDate timestamp,  
    USERNAME varchar(255),  
    LOCKER_ID bigint,  
    TEAM_ID bigint,  
    primary key (MEMBER_ID)  
)  
=====================================================================  
  
컬럼명도 변경이 가능함  
BaseEntity class  
=====================================================================  
public class BaseEntity {  
	@Column(name="INSERT_MEMBER")  
	private String createdBy;  
  
	private LocalDateTime createdDate;  
  
	@Column(name="UPDATE_MEMBER")  
	private String lastModifiedBy;  
  
	private LocalDateTime lastModifiedDate;  
  
=====================================================================