본문 바로가기
-- 오늘 있었던 개발 일기

오늘의 개발 문제 : 추상클래스

by code study 2025. 12. 12.

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 하나만 건드리면 됨
확장성 새 엔티티 추가할 때 상속만 하면 끝

오늘 배운 것 

  1. DRY 원칙은 진짜다 - 중복 코드는 반드시 발목을 잡는다
  2. 처음부터 완벽할 필요 없다 - 중복이 보일 때 리팩토링해도 늦지 않다
  3. @MappedSuperclass 유용하다 - 테이블 생성 없이 필드만 상속 가능
  4. 관심사 분리 - 비즈니스 로직과 기술적 관심사(시간 관리)를 나누니까 깔끔해졌다

앞으로 복붙하고 있는 나를 발견하면, 일단 멈추고 생각하자