JPA 학습 일기 - BaseTimeEntity로 중복 코드 탈출하기
JPA로 엔티티를 만들다가 똑같은 코드를 계속 복붙하고 있는 나를 발견했다.
처음에 Member 엔티티를 만들 때 생성 시간이랑 수정 시간을 넣었다.
@Entity
public class Member {
@Id
private Long id;
private String name;
private String email;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createTime;
@LastModifiedDate
private LocalDateTime updateTime;
}
여기까진 좋았다.
문제 발생
Board 엔티티 추가... 똑같은 시간 필드 복붙.
Comment 엔티티 추가... 또 복붙.
Tag 엔티티 추가... 또또 복붙.
어느 순간 내가 복붙 기계가 된 느낌이었다. 엔티티마다 8줄씩 똑같은 코드가 들어가고 있었다.
해결책
@MappedSuperclass라는 걸 알게 됐다!
공통 필드를 부모 클래스로 빼고, 각 엔티티가 상속받으면 된다.
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createTime;
@LastModifiedDate
private LocalDateTime updateTime;
}
이제 엔티티는 이렇게만 쓰면 끝!
@Entity
public class Member extends BaseTimeEntity {
@Id
private Long id;
private String name;
private String email;
// 시간 필드? 상속받았으니까 끝!
}
결과
Before: 엔티티마다 8줄씩 중복
After: extends BaseTimeEntity 한 줄로 해결
개선 포인트효과
| 코드량 | 엔티티당 8줄 감소 |
| 일관성 | 모든 엔티티 시간 관리 방식 통일 |
| 유지보수 | 수정할 때 BaseTimeEntity 하나만 건드리면 됨 |
| 확장성 | 새 엔티티 추가할 때 상속만 하면 끝 |
오늘 배운 것
- DRY 원칙은 진짜다 - 중복 코드는 반드시 발목을 잡는다
- 처음부터 완벽할 필요 없다 - 중복이 보일 때 리팩토링해도 늦지 않다
- @MappedSuperclass 유용하다 - 테이블 생성 없이 필드만 상속 가능
- 관심사 분리 - 비즈니스 로직과 기술적 관심사(시간 관리)를 나누니까 깔끔해졌다
앞으로 복붙하고 있는 나를 발견하면, 일단 멈추고 생각하자
'-- 오늘 있었던 개발 일기' 카테고리의 다른 글
| 자바의 Collections Framework에 대해 (0) | 2025.12.15 |
|---|---|
| 오늘의 개발 문제 : 리액트, html REST API 연결 (0) | 2025.12.15 |
| 오늘의 개발 문제 : DTO 필드명 불일치 (0) | 2025.12.09 |
| 오늘의 개발 문제 : SOLID원칙에 우선순위 (0) | 2025.12.08 |
| solid (0) | 2025.12.07 |