0+ 스프링/0 + 스프링 ORM(JPA)

[JPA] @MappedSuperclass(공통 매핑 정보 해결 + 스프링 적용)

힘들면힘을내는쿼카 2023. 2. 20. 21:57
728x90
반응형

[JPA] @MappedSuperclass(공통 매핑 정보 해결)

테이블을 설계하다 보면 공통적으로 사용 되는 컬럼들이 있습니다.
생성시간(createDate), 수정시간(lastModifiedDate) 같은것을 예를 들수 있겠군요. ㅎㅎ
엔티티를 생성할때마다 공통 속성들을 생성하면 너무 귀찮겠죠?
(개발자들은 귀찮은 것은 절대 못 참아요. !!😡)

 

 

 

@MappedSuperclass 등장

그래서 JPA에서는 이렇게 공통적으로 사용하는 컬럼을 하나의 클래스에서 관리할 수 있도록 해줍니다.
@MappedSuperclass를 사용하면 말이죠!

 

@MappedSuperclass
public abstract class BaseTimeEntity {

    private LocalDateTime createDate;

    private LocalDateTime lastModifiedDate;
}
public Member extends BaseTimeEntity {
 //..//
}

이런식으로 사용 하면 됩니다.

정리

  • 공통 매핑 정보가 필요할 때 사용
    • e.g) id, name, createTime, modifiedTime
  • 상속관계 매핑 🙅‍♀️
  • 엔티티 🙅‍♀️
  • 테이블과 매핑 🙅‍♀️
  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
  • 조회, 검색 불가
    • (em.find(BaseEntity.class, id) 불가)
    • 부모 클래스임에도 불구하고 조회가 안된다는 의미 입니다.
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스(abstract) 권장

스프링에서 자동화 하기

BaseTimeEntity

@MappedSuperclas를 사용하여 공통 속성 클래스를 생성합니다.
JPA에서 제공하는 기능인 Audit를 사용합니다.
간략하게 설명하자면 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다.
(@EntityListeners(AuditingEntityListener.class)를 설정하면 됩니다.!)

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}

Order

BaseTimeEntity를 상속 받는 Entity를 생성 합니다.

@Entity @Getter
@Table(name = "orders")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order extends BaseTimeEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "order_id")
    private Long id;

    // .. //
}

BackendApplication

JPA에서 제공하는 기능인 Audit를 사용하기 위해
스프링 메인 클래스에 @EnableJpaAuditing를 추가합니다.

@EnableJpaAuditing
public class BackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(BackendApplication.class, args);
    }
}

정리

  • 테이블과 관계 없고, 단순히 Entity가 공통으로 사용하는 매핑 정보를 모으는 역할입니다.
  • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용합니다.

 

✅ 참고: @Entity 클래스는 Entity@MappedSuperclass로 지정한 클래스만 상속 가능 합니다.

 

 

 

 

728x90
반응형