1. BaseTimeEntity란?
BaseTimeEntity는 모든 엔티티에서 공통적으로 사용하는 생성일(createdAt)과 수정일(updatedAt) 필드를 자동으로 관리하는 추상 클래스다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false, updatable = false) // 데이터 생성 이후에 생성일은 편집되지 않도록 설계
protected LocalDateTime createdAt;
@LastModifiedDate
@Column(nullable = false)
protected LocalDateTime updatedAt;
}
2. BaseTimeEntity를 상속해서 사용하는 이유
✅ 장점 비교
항목 | BaseTimeEntity 상속 방식 | 직접 필드 작성 방식 |
---|---|---|
중복 제거 | O (중앙에서 관리) | X (엔티티마다 중복) |
유지보수 용이 | O (공통 클래스로 수정 시 전체 반영) | X (엔티티마다 일일이 수정) |
일관성 유지 | O | X (실수로 누락 가능) |
가독성 | O (핵심 도메인에만 집중 가능) | X (공통 코드가 함께 섞임) |
3. BaseTimeEntity를 사용하는 방법 (JPA Auditing 적용)
✅ Step 1. BaseTimeEntity 작성
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
protected LocalDateTime createdAt;
@LastModifiedDate
protected LocalDateTime updatedAt;
}
✅ Step 2. @EnableJpaAuditing 활성화
Spring Boot 메인 클래스에 아래 애노테이션을 추가한다.
@EnableJpaAuditing // 추가
@SpringBootApplication
public class ScheduleManageAppApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleManageAppApplication.class, args);
}
}
✅ Step 3. 엔티티에서 상속받기
@Entity
public class Schedule extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long scheduleId;
private String todoTitle;
private String todoContent;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private Users users;
// 생성자
public Schedule(String todoTitle, String todoContent, Users users) {
this.todoTitle = todoTitle;
this.todoContent = todoContent;
this.users = users;
}
}
✅ 예시: 생성 시 자동 시간 저장
Schedule schedule = new Schedule("제목", "내용", user);
scheduleRepository.save(schedule);
// createdAt, updatedAt은 자동으로 LocalDateTime.now()로 채워짐
🔔 주의 사항
- @CreatedDate, @LastModifiedDate는 엔티티가 @EntityListeners로 등록된 경우에만 동작한다.
- BaseTimeEntity에 선언한 필드에 초기값을 직접 넣지 않아야 JPA Auditing이 자동으로 채워준다.
📌 결론
사용 상황 추천 방식 요약 !!!
여러 엔티티가 생성일/수정일 필드를 공통으로 필요로 함 | ✅ BaseTimeEntity 상속 |
---|---|
단일 엔티티만 관리하거나 특별한 처리 로직이 있는 경우 | 직접 정의도 가능하지만 유지보수 측면에서 비효율적 |
'Backend > Spring' 카테고리의 다른 글
Helper Class (0) | 2025.04.02 |
---|---|
ServiceHelper를 통한 Service 코드 책임 분리 (0) | 2025.04.01 |
JPA와 영속성 컨텍스트 (0) | 2025.03.31 |
[Spring 기초] 일정 관리 앱 만들기 (0) | 2025.03.26 |
JWT 토큰 인증 이란? (0) | 2025.03.25 |