-
@MappedSuperclass 에 대해 알아 봅시다.JPA 2025. 6. 10. 08:46
@MappedSuperclass 는 공통 컬럼 매핑만 공유하고 독립적인 테이블은 만들지 않는 JPA 상속 전략입니다.
- 엔티티가 아니므로 직접 조회·저장 대상에 속하지 않고, JPQL에서 타입으로 사용할 수도 없습니다.
- 하위 엔티티가 상속받으면, 상위 클래스의 필드가 하위 엔티티 테이블에 그대로 포함 됩니다.
@MappedSuperclass public abstract class baseTimeEntity { private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Entity public class User exteds BaseTimeEntity { @Id @GeneratedValue private Long id; private String email; } @Entity public class Product extends BaseTimeEntity { @Id @GeneratedValue private Long id; private String name; }
위 코드는 다음 테이블로 생성됩니다.
BaseTimeEntity에 대응하는 전용 테이블은 없고, 각 자식 테이블에 공통 컬럼이 복사됩니다.created_at, updated_at 두 컬럼은 BaseTimeEntity에서 내려온 공통 코드입니다.
언제 사용해야 하는가?
- 감사 로그 컬럼 공유 : createdAt, updatedAt, creatdBy 등을 모든 도메인 테이블에 두고 싶을 때
- 공통 비즈니스 컬럼 공유 : price, currency, status 등이 여러 엔티티에서 동일 로직 타입일 때
장단점을 비교해 보면 다음과 같습니다.
- 매핑 재사용 : [장점]중복 컬럼 선언 방지, 유지보수 편리 [단점]공통 컬럼 구조가 바뀌면 모든 테이블의 DDL을 변경해야 함
- 설계 유연성 : [장점]상속 구조가 복잡해도 물리적 조인 부담 없음 [단점] @MappedSuperclass 자체는 JPQL 대상이 아니라 다형성 쿼리 불가
@Inheritance(strategy = JOINED | SINGLE_TABLE | TABLE_PER_CLASS) 와 달리, @MappedSuperClass 는 상속 매핑 전략이 아니라 '필드 복사' 개념임을 기억해야 합니다.
직접 생성해서 사용할 일이 없으므로 추상클래스로 선언해서 사용하는게 좋습니다.