반응형
JPA를 사용하다 보면 여러 엔티티에서 공통으로 쓰이는 컬럼이 반복적으로 등장합니다.
예를 들어, id, 생성일, 수정일, 작성자 같은 필드는 대부분의 엔티티에서 공통적으로 관리됩니다.
이럴 때 JPA에서 제공하는 @MappedSuperclass를 사용하면 중복을 줄이고 깔끔하게 관리할 수 있습니다.
📖 @MappedSuperclass란?
- 공통 매핑 정보를 모아두는 클래스
- 엔티티가 아니며, 테이블과 직접 매핑되지 않음
- 단순히 자식 엔티티에게 매핑 정보만 제공하는 역할
- 따라서 em.find(BaseEntity) 같은 직접 조회는 불가능
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue
private Long id;
private String createdBy;
private LocalDateTime createdDate;
private String modifiedBy;
private LocalDateTime modifiedDate;
// getter, setter
}
🛠️ 사용 예시
@Entity
public class Member extends BaseEntity {
private String name;
private String email;
}
@Entity
public class Order extends BaseEntity {
private String orderNumber;
private BigDecimal price;
}
위 예시에서 Member와 Order 엔티티는 BaseEntity의 공통 필드(id, createdBy, createdDate, modifiedBy, modifiedDate)를 상속받아 자동으로 매핑됩니다.
📌 특징
✅ 상속관계 매핑(@Inheritance) 과 다름
- @MappedSuperclass는 단순히 필드 매핑만 상속
- 조인이나 다형성 쿼리 같은 기능은 제공하지 않음
✅ 엔티티 아님
- @Entity처럼 테이블과 직접 매핑되지 않음
- 따라서 em.find(BaseEntity.class, id) → ❌ 불가
✅ 공통 필드 관리에 적합
- 등록일, 수정일, 등록자, 수정자 같은 필드를 모아서 관리할 때 유용
- 중복 코드 제거 및 유지보수성 향상
✅ 추상 클래스 권장
- 직접 인스턴스화할 일이 없기 때문에 abstract class로 선언하는 것이 좋음
반응형
'Back end > Spring Project' 카테고리의 다른 글
| [SpringBoot] SQL 쿼리 파라미터 로그 남기는 방법 (0) | 2026.01.02 |
|---|---|
| [Spring] JPA - 프록시(Proxy) (0) | 2025.08.29 |
| [Spring] JPA 양방향 연관관계와 연관관계의 주인 (0) | 2025.08.20 |
| [Spring] JPA 준영속 상태(Detached) (0) | 2025.08.15 |
| [Spring] JPA flush (0) | 2025.08.14 |