@Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)// JPA Auditing 활성화publicabstractclassBaseEntity{@CreatedDate@Column(updatable =false)// 생성 후 변경 불가privateLocalDateTime createdAt;@LastModifiedDateprivateLocalDateTime updatedAt;@CreatedBy@Column(updatable =false)privateString createdBy;// 생성자 ID (Spring Security 연동)@LastModifiedByprivateString updatedBy;// 수정자 ID}
// 자식 엔티티 — BaseEntity를 상속받아 공통 필드 자동 포함@Entity@Table(name ="posts")publicclassPostextendsBaseEntity{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString title;privateString content;// createdAt, updatedAt 등은 BaseEntity에서 상속}// DB 테이블에는 posts 테이블만 생성됨:// id, title, content, created_at, updated_at, created_by, updated_by
// Spring Boot 시작 클래스 또는 설정 클래스에 추가@SpringBootApplication@EnableJpaAuditing// Auditing 기능 활성화 필수publicclassBlogApplication{publicstaticvoidmain(String[] args){SpringApplication.run(BlogApplication.class, args);}}
@Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)publicabstractclassBaseTimeEntity{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;@CreatedDate@Column(updatable =false)privateLocalDateTime createdAt;@LastModifiedDateprivateLocalDateTime updatedAt;}// 자식 엔티티는 id + 시간 필드를 모두 상속@EntitypublicclassCommentextendsBaseTimeEntity{privateString content;// id, createdAt, updatedAt은 BaseTimeEntity에서 상속}
// MongoDB는 @Document + @MappedSuperclass 대신 직접 필드 공유publicabstractclassBaseDocument{@IdprivateString id;@CreatedDateprivateLocalDateTime createdAt;@LastModifiedDateprivateLocalDateTime updatedAt;}@Document(collection ="posts")publicclassPostextendsBaseDocument{privateString title;}