JPA를 사용하면서 @CreatedDate, @LastModifiedDate 어노테이션을 유용하게 사용했었습니다.
Entity를 생성하면 자동으로 생성 시간을 넣어주고, Update가 발생하면 자동으로 수정 시간을 변경해주었습니다.
현재 Scrum, User 엔티티에서 해당 어노테이션을 사용하는데 전부 Entity마다 각각 지정을 해주었었습니다.
@CreatedDate
@Column(nullable = false)
private LocalDateTime createdDate;
@LastModifiedDate
@Column(nullable = false)
private LocalDateTime updatedDate;
모든 테이블마다 이렇게 동일한 코드를 사용하는 것은 너무 비효율적이라는 생각이 들었습니다.
그래서 찾아보다가 시간만 넣어주는 Class를 만들어서 해당 클래스를 상속하는 방법으로 컬럼 지정이 가능한 걸 보았습니다.
바로 적용시켜보겠습니다.
우선 시간을 가지고 있을 Class가 필요합니다.
@Getter
@MappedSuperclass // 해당 Entity를 상속한 Entity는 아래 필드를 컬럼으로 가짐.
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
@MappedSuperclass를 사용하면 해당 클래스가 가지고 있는 필드를 매핑 정보로 사용합니다.
즉 BaseTimeEntity를 상속받은 클래스는 createdDate, lastModifiedDate 컬럼을 사용하게 됩니다.
이 방법을 통해 똑같은 컬럼을 계속해서 생성하지 않아도 돼서 중복 코드를 줄일 수 있습니다.
단 해당 BaseTimeEntity로 직접 인스턴스를 만들 일은 없으므로 abstract를 달아서 추상 클래스라고 명시해두길 권장합니다.!
public class User extends BaseTimeEntity {
이후 해당 클래스를 상속받아 사용하면 동일한 효과를 누릴 수 있습니다.
보통은 시간을 설정할 때 많이 쓰지만 id, name처럼 모두가 가지고 있는 중복 정보들이 있으면 이렇게 추상 클래스로 묶는 것이 훨씬 유지보수하기 편하다는 생각이 듭니다.
반응형
'프로젝트 > 씈크럼 프로젝트' 카테고리의 다른 글
for문을 stream으로 변경하자.(근데 왜 더 느리지?) (0) | 2024.02.24 |
---|---|
내가 원하는 컬럼만 업데이트 쿼리가 나가고싶은데..(feat, DynamicUpdate) (0) | 2024.02.22 |
QueryDsl로 페이지네이션 도입(검색 API 구현) (1) | 2024.02.17 |
QueryDSL 도입기 (0) | 2024.02.17 |