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입니다!!!