BE/Spring-Boot

[JPA Auditing] 생성자/수정자 자동화 (+생성 일시/수정 일시)

suhyeon chae 2023. 11. 3. 21:46
사용 기술
springboot 3.xx
spring security
spring data jpa

 

해당 포스팅은 스프링 부트 3버전스프링 시큐리티를 사용하는 코드 입니다.

 

코드 작성

- 등록 일자/등록자 class

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class CreatedInfo {
    @Comment("등록 일자")
    @Column(updatable = false)
    @CreatedDate
    private LocalDateTime createdAt;

    @Comment("등록자")
    @CreatedBy
    @Column(updatable = false)
    private String createdBy;
}

 

 

- 수정일자/수정자 class (당연히 내가 사용하고자 하는 엔티티에 BaseEntity 또는 CreatedInfo 를 상속받아야 합니다.)

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity extends CreatedInfo {

    @Comment("수정 일자")
    @LastModifiedDate
    private LocalDateTime updatedAt;

    @Comment("수정자")
    @LastModifiedBy
    private String updatedBy;
}

 

@EnableJpaAuditing // 필수!
@SpringBootApplication
public class BackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(BackendApplication.class, args);
    }

}

 

1. 우선 위 처럼 등록자/등록 일시 - 수정자/수정일시를 담고 있는 class를 생성합니다. 

2.  @EntityListeners(AuditingEntityListener.class) 코드를 꼭 적어줍니다. 

3. application 최상단에서 EnableJpaAuditing 설정을 해줍니다.  여기까지하면 생성일시/수정일시는 자동으로 들어갑니다. 생성자와 수정자를 넣어주기 위해서는 추가적인 작업이 필요합니다. 

 

 

- 생성자/수정자 넣어주기 위한 추가 작업 (Audit 설정 파일)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;

@Configuration
public class JpaAuditConfig {
    @Bean
    public AuditorAware<String> auditorProvider() {
        return new AuditAwareImpl();
    }
}

 

 

import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

import java.util.Optional;

public class AuditAwareImpl implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (null == authentication || !authentication.isAuthenticated()) {
            return null;
        }
        User user = (User) authentication.getPrincipal();
        return Optional.of(user.getUsername());
    }
}

 

위 코드처럼 작성만 해주면 save 할 때 생성자/수정자 잘 들어가는 것을 확인할 수 있습니다! 

제가 삽질했던 부분인데, 주의하셔야하는 점이  User user = (User) authentication.getPrincipal(); 이 부분인데, User는 security.core.userdetails의 User입니다!!!