Auditing을 이용한 타임스탬프 자동화와 super

poogie·2022년 5월 23일
0

.시작하기전에

테이블에서 생성일자와 수정일자를 남겨야했다.

mysql에서 default값으로 now()를 넣어주면 행이 생성될때마다 생성일자가 자동으로 기입되어서 문제가 없었지만 행을 수정해야할때 수정일자를 입력하는 것이 제법 까다로웠다.

수정할때마다 update_date을 변경해주는 코드를 짜면서 이정도는 자동화방법이 충분히 있을것이라 판단되었고 구글링을 시작하였다.

.@CreatedDate @LastModifiedDate

Auditing의 기능인데 해당 어노테이션을 달아놓으면 생성일자와 변경일자를 자동화해주는 spring boot 기본 라이브러리인것 같다.

사용방법은 꽤나 간단했는데 아래코드를 보자

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor
public abstract class AutoDate {
    @CreatedDate
    private LocalDateTime createDate;
    @LastModifiedDate
    private LocalDateTime updateDate;

    public AutoDate(LocalDateTime createDate, LocalDateTime updateDate) {
        this.createDate = createDate;
        this.updateDate = updateDate;
    }
}

일단 일자 자동화클래스를 따로 분리하여 어노테이션을 달아놓는다.

두개의 생소한 어노테이션이 보일텐데 설명하자면 아래와 같다.

@EntityListeners는 엔티티의 변화가 감지되면 동작하도록 돕는 어노테이션이다.

엔티티의 변화(생성또는수정)가 생기면 CreatedDate와 LastModifiedDate가 동작해야하기 때문에 달아주도록 하자.

@MappedSuperclass는 자식클래스에게 date값을 매핑해주기만을 위해 존재한다는 것을 명시하기 위함이다.

해당 어노테이션을 달아놓으면 엔티티매핑과 테이블매핑도 되지않고 조회또한 되지않기에 혹시나의 에러를 방지하고 자기임무만을 완벽히 해낼수있다.

또한 자식 클래스에게 자동화된 데이터를 보여주기만 할뿐 손댈일이 없기때문에 추상클래스로 만들어주었다.

이제 Date를 따로 분리했으면 엔티티클래스에 상속을 해줘야하는데 간단하다.

@Entity
@Getter
@NoArgsConstructor
@Table(name="user")
public class UserEntity extends AutoDate {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String email;
    private String password;
    private String name;
    private String isDeleted;

    @Builder
    public UserEntity(Long id, String email, String password, String name, String isDeleted) {
        this.id = id;
        this.email = email;
        this.password = password;
        this.name = name;
        this.isDeleted = isDeleted;
    }
}

엔티티에 상속까지 해주면 완료된다.


생성일자와 수정일자가 잘 입력되는 것을 볼 수 있다.

아직 수정기능은 개발하지 않아서 수정일자만 변경되는 테스트는 뒤로 미뤄야하지만 문제없을것같다.

.문제발생

삽입은 잘되는 것을 확인했으나 한가지 문제가 발생했다.

유저 정보를 받아올때 생성일자와 수정일자를 받아올 수 없다는 것이다.

일자를 보여주어야 하는 정보에는 필요로 할것이기 때문에 미리 작업을 해주어야할것이다.

.super와 상속

위 문제는 엔티티에서 AutoDate클래스 값을 빌드는 하지않도록 하나 값을 가지고는 있도록 하면 될것이다.

그러면 상속에서의 문제로 판단되는데 이때 super가 사용된다.

super는 자식 클래스가 부모 클래스의 필드값이나 메소드를 참조할때 사용된다.

생성자에서 super를 통해서 date값을 가져온다면 값을 수정하지는 않으나 엔티티의 필드에 자리잡아 Repository에서 값을 받을때 date값을 포함하게 될것이다.

@Builder
    public UserEntity(Long id, String email, String password, String name, String isDeleted,
                        LocalDateTime createDate, LocalDateTime updateDate) {
        super(createDate, updateDate);
        this.id = id;
        this.email = email;
        this.password = password;
        this.name = name;
        this.isDeleted = isDeleted;
    }

위처럼 생성자에서 super를 통해 AutoDate클래스의 값을 필드에 참조하게 되었다.


일자까지 클라이언트에게 뿌려주는 것으로 해당기능은 마무리 되었다.

profile
불안한 개발자

0개의 댓글