@MappedSuperclass는 JPA에서 사용하는 어노테이션으로, 상속 구조에서 공통된 매핑 정보를 부모 클래스에 정의할 때 사용됩니다. 이 어노테이션이 적용된 클래스는 실제로 테이블과 매핑되지 않지만, 상속받는 자식 엔티티 클래스에 매핑 정보를 제공할 수 있습니다.
주요 특징
- @MappedSuperclass가 붙은 클래스 자체는 엔티티로서 직접 사용할 수 없으며, 테이블로도 생성되지 않습니다.
- 공통적인 필드나 매핑 정보를 정의하는 데 유용합니다.
- 상속받은 하위 엔티티는 이 클래스에서 정의된 필드와 매핑을 그대로 가져와 사용할 수 있습니다.
사용 예시
부모 클래스에 공통 필드 정의
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@PrePersist
public void prePersist() {
this.createdAt = LocalDateTime.now();
}
@PreUpdate
public void preUpdate() {
this.updatedAt = LocalDateTime.now();
}
}
자식 엔티티가 BaseEntity를 상속받는 경우
@Entity
public class User extends BaseEntity {
private String username;
private String email;
}
설명
- User 엔티티는 BaseEntity의 모든 필드(id, createdAt, updatedAt)를 상속받아 사용할 수 있으며, 데이터베이스 테이블에도 해당 필드들이 포함됩니다.
- BaseEntity 자체는 데이터베이스 테이블로 매핑되지 않으므로, 독립적인 엔티티가 아니라 부모 클래스로서 공통된 매핑만 제공하는 역할을 합니다.
활용 사례
- 공통된 필드(예: id, createdAt, updatedAt 등)를 여러 엔티티에 반복적으로 선언하지 않고, 상속을 통해 재사용성을 높일 때 사용합니다.
- 데이터베이스 컬럼 매핑이나 공통된 메서드, 이벤트 리스너 등을 상속 구조를 통해 관리하고자 할 때 유용합니다.
@MappedSuperclass는 JPA 엔티티 설계에서 중복 코드를 줄이고 공통적인 매핑 규칙을 중앙에서 관리할 수 있게 하여, 코드의 재사용성과 가독성을 높이는 데 도움이 됩니다.
'Spring > Spring JPA' 카테고리의 다른 글
[JPA] @OneToOne (0) | 2024.11.25 |
---|---|
[JPA] EntityListener 간단하게 (0) | 2024.11.16 |
[JPA] ApplicationContextAware 간단하게 (0) | 2024.11.16 |
[JPA] ENUM 타입 (0) | 2024.11.12 |
[JPA] 엔티티 클래스에서 많이 사용되는 어노테이션 (0) | 2024.11.12 |