JPA | Auditing

DoItDev·2021년 11월 28일
0
post-thumbnail

Overview

JPA 에서 DB 에서 데이터 작성인과 작성일에 대한 어노테이션을 제공을 해준다.

기존에는 insert/update 시에 대한 작성자 및 작성일 그리고 업데이트 일자 및 업데이트 작성자 누군지에 대한 어노테이션을 제공을 해준다

초기 Base Domain 설계

일단 글쓴이의 경우 @MappedSuperclass 로 도메인의 관점과 중복되는 점을 분할해서 도메인을 설계를 해주었다.

위의 @MppedSupperclass가 궁금하시다면 한번 참고 해도 좋을 것이다.

처음에 작성을 할 때 본인은 아래와 같이 base entity를 구성을 해주었다.

@Getter
@MappedSuperclass
public abstract class BaseEntity {

    @CreatedBy
    @Column(name = "create_by", nullable = false)
    private String createBy;

    @LastModifiedBy
    @Column(name = "update_by", nullable = false)
    private String updateBy;

    @CreatedDate
    @Column(name = "create_date", nullable = false)
    private Instant createDate;

    @LastModifiedDate
    @Column(name = "update_date")
    private Instant updateDate;


    @PrePersist
    public void prePersist() {
        this.createBy = SecurityUtils.getByCurrentLoginName().orElse("system");
        this.updateBy = SecurityUtils.getByCurrentLoginName().orElse("system");
    }

    @PreUpdate
    public void preUpdate() {
        this.updateBy = SecurityUtils.getByCurrentLoginName().orElse("system");
    }

}

위의 코드를 설명을 하면는

@createBy, @LastModifiedBy 의 경우 누가 작성을 했는 지를 알려주는 것을 의미한다.

한마디로 user 의 정보가 담기게 해주는 역할을 한다고 생각을 하시면 된다.

작성작의 경우 user의 name 을 담으려는 의도로 위와 같이 string 형식으로 도메인을 설계를 해주었다.

여기서 user 객체를 참조를 해도 된다. 하지만 역할의나 설계에 따라 달라지는 점을 주의해서 설계를 해주어야 한다.

글쓴이가 컬럼을 만든 목적은 단순한 유저의 이름을 저장하기 위함이다 그렇기 때문에 필자들은 역할에 맞게 커스텀하는 것이 목적일 것이다.

@createdDate, @LastModifiedDate의 경우 insert date 와 update date 를 자동적으로 매핑 해주는 어노테이션이다.

두가지의 경우 jpa (즉, 어플리케이션)에서의 트랜직션이 일어날시 date 값을 넣어준다.

도메인에서 default 로 처리를 해주는 방식은 아닌 샘이다.. 그렇기 때문에 이점을 유의해주어야 합니다.

@PrePersist,@PreUpdate 두 가지 어노테이션의 경우 insert, update 시 어떤 액션을 줄지에 대한 어노테이션이다.

insert시 나는 무조건 createBy를 시큐리티에 저장 되어있는 값을 이용을 할꺼란 듯이기도 한다.

Auditing로 리펙토링

위 처럼 도메인을 작성을하면서 당연시 하게 위의 것이 당연하다고 생각을 하였다.

하지만 jpa docs 에서 참고를 해보니 다른 방식이 있는 것을 알게 되었다.

auditing 의 번역을 하면 감시하다 라는 번역이 된다. 그렇기 때문에 jpa 에서 제공을 해주는 auditing 기능으로 리펙토링을 하려고한다.

먼저 jpa 에서 auditing 기능을 활성을 하고자 한다. jpa configuration 을 따로 관리를 하고자 하였다.

@Configuration
@EnableJpaAuditing
public class JpaConfiguration {
    @Bean
    public SpringSecurityAuditorAware auditorAware() {
        return new SpringSecurityAuditorAware();
    }
}

@EnableJpaAuditing 의 어노테이션을 가지고 활성화를 시킨다.

그리고 SpringSecurityAuditorAware 로 빈을 주입 시켜준다. custom 할 SpringSecurityAuditorAware 가 필요할것이다.

public class SpringSecurityAuditorAware implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        return SecurityUtils.getByCurrentLoginName();
    }
}

AuditorAware 를 상속을 받는다 후에 부분에서 사용할 값 User 도메인 혹은 글쓴이의 경우 string 으로 받고자 하였다.

getCurrentAuditor 메소드의 경우 베이스 도메인에서 createby , updateby에 들어갈 값을 작성을 해주시면 됩니다.

글쓴이의 경우 앞서서 말했듯이 유저의 이름을 db 에서 저장을 시키기 위하여 string 으로 받는다고 해서 위와 같이 개발을 했습니다.


@Getter
@MappedSuperclass
@EntityListeners(value = {AuditingEntityListener.class})
public abstract class BaseEntity {

    @CreatedBy
    @Column(name = "create_by", nullable = false)
    private String createBy;

    @LastModifiedBy
    @Column(name = "update_by", nullable = false)
    private String updateBy;

    @CreatedDate
    @Column(name = "create_date", nullable = false)
    private Instant createDate;

    @LastModifiedDate
    @Column(name = "update_date")
    private Instant updateDate;

}

베이스 도메인을 위와 같이 리펙토링 하였습니다. 기존 코드에 비해 많이 간결해 졌습니다.

간단하게 설명을 하면 @EntityListeners(value = {AuditingEntityListener.class}) 를 사용을 하니 Auditing 기능이 활성화 되었습니다.

Insert

스크린샷 2021-11-28 오전 10 52 34 스크린샷 2021-11-28 오전 10 53 35

update

스크린샷 2021-11-28 오전 10 54 08 스크린샷 2021-11-28 오전 10 53 51
profile
Back-End Engineer

0개의 댓글