728x90
01. @MappedSuperclass
사용 목적
공통 매핑 정보가 필요할 때 사용한다. DB 입장에서 테이블은 다른데 객체 입장에서 상속 받아서 사용하고 싶을 때 사용한다.
아래 그림에서 id
와 name
이 공통 속성인 것을 볼 수 있다.
@MappedSuperclass는
1) 상속관계 매핑이 아니다.
2) 엔티티를 나타내는 것이 아니며, 테이블과 매핑하지 않는다.
3) 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.
4) 조회 및 검색이 불가능하다.
5) 직접 생성해서 사용할 일이 없으므로 추상 클래스로 만들기를 권장한다.
6) 테이블과 관계는 전혀 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.
7) 주로 등록일, 수정일, 등록자, 수정자와 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
참고로, @Entity 클래스는 엔티티나 @MappedSuperclass 지정한 클래스만 상속이 가능하다.
02. @MappedSuperclass 예제 코드
만약 모든 테이블에 작성자, 작성일, 최근수정자, 최근수정일이 포함되어야 한다면, 모든 테이블에 다음과 같은 정보들이 들어가야 할 것이다.
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
딱 봐도 비효율적인 것 같다. @MappedSuperclass 를 사용하면 이러한 불편함을 해결할 수 있다. 아래는 @MappedSuperclass 를 활용하는 방식이다. 슈퍼 클래스가 될 BaseEntity를 만들고 다음과 같이 작성한다.
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
Member 클래스와 Team 클래스에는 다음과 같이 BaseEntity 클래스를 상속받음을 작성한다.
@Entity
public class Member extends BaseEntity { .. }
@Entity
public class Team extends BaseEntity { .. }
JpaMain 클래스에서 try문 안에 다음과 같이 작성하면
Member member = new Member();
member.setUsername("h");
member.setCreatedBy("kim");
member.setCreatedDate(LocalDateTime.now());
em.persist(member);
em.flush();
em.clear();
tx.commit();
Member와 Team 테이블에 BaseEntity의 속성이 포함되어 테이블이 생성됨을 볼 수 있다.
03. @Entity와 @MappedSuperclass 의 차이
@Entity
는 상속관계를 매핑하는 annotation이고, @MappedSuperclass
는 속성만 매핑하는 annotation이다.
728x90
'JPA' 카테고리의 다른 글
즉시 로딩과 지연 로딩 (2) | 2024.01.12 |
---|---|
프록시 (0) | 2024.01.12 |
상속관계 매핑 (0) | 2024.01.08 |
다양한 연관관계 매핑 (0) | 2024.01.07 |
양방향 연관관계와 연관관계의 주인 (2) | 2024.01.06 |