HyeLog

[김영한_자바 ORM 표준 JPA 프로그래밍 - 기본편] 6. 고급 매핑(MappedSuperclass) 본문

웹 개발/Spring Boot

[김영한_자바 ORM 표준 JPA 프로그래밍 - 기본편] 6. 고급 매핑(MappedSuperclass)

shj718 2022. 6. 17. 15:19

@MappedSuperclass 란?

@MappedSuperclass공통 매핑 정보가 필요할 때 사용한다. 예를 들어, 거의 모든 테이블에 등록자, 등록일, 수정자, 수정일(createdBy, createdDate, modifiedBy, modifiedDate) 컬럼이 필요하다. 이 공통 컬럼들만 모아서 따로 하나의 클래스를 만들고 @MappedSuperclass 어노테이션을 붙이면, 각 테이블마다 공통 컬럼들이 생기게 된다.

 

이때 중요한 사실은 @MappedSuperclass 는 상속관계 매핑이 아니라는 점이다. 단순히 공통된 매핑정보를 묶기 위해서 사용한다. 따라서, 해당 클래스는 테이블이 만들어지지 않는다. 그래서 추상 클래스로 만드는 것을 권장한다.

 

코드를 보면, BaseEntity 클래스에 @MappedSuperclass 를 붙이고 다른 엔티티들이 이것을 extend 하고 있다.

@MappedSuperclass
public abstract class BaseEntity {
    private String createdBy;
    private LocalDateTime createdDateTime;
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDateTime;

    // getter(), setter()
}
@Entity
public class Member extends BaseEntity {
@Entity
public class Team extends BaseEntity {

 

실행해보자.

Team team = new Team();
team.setName("teamA");
team.setCreatedBy("hongik");
team.setCreatedDateTime(LocalDateTime.now());
em.persist(team);

Member member = new Member();
member.setUsername("shj");
member.setCreatedBy("admin");
member.setCreatedDateTime(LocalDateTime.now());
member.changeTeam(team);
em.persist(member);

transaction.commit();

 

결과를 보면, Team 테이블과 Member 테이블에 모두 공통 컬럼(등록자, 등록일, 수정자, 수정일)이 생겼다.

 

👩‍💻 실무에서 BaseEntity에 공통 매핑 정보를 넣는 기술은 많이 사용되므로 기억해두자. 👩‍💻