auditing

์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ, ๋ณ€๊ฒฝ ์‹œ ์‹œ๊ฐ„์ด๋‚˜ ์ˆ˜์ •์ž๊ฐ™์€ ํ•„๋“œ๋Š” ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์—์„œ ๊ณตํ†ต์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณตํ†ต์œผ๋กœ ๋“ฑ๋กํ•  ๋‹ค์Œ 4๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

  • ๋“ฑ๋ก์ผ

  • ์ˆ˜์ •์ผ

  • ๋“ฑ๋ก์ž

  • ์ˆ˜์ •์ž

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity extends BaseTimeEntity {
    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;
}

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ ๋“ฑ๋ก์ผ, ์ˆ˜์ •์ผ์ด ํ•„์š”ํ•  ๋•Œ๋Š” BaseTimeEntity๋ฅผ, ๋“ฑ๋ก์ž, ์ˆ˜์ •์ž๊นŒ์ง€ ํ•„์š”ํ•  ๊ฒฝ์šฐ BaseEntity๋ฅผ ์ƒ์†ํ•ด ๋“ฑ๋ก์ผ, ์ˆ˜์ •์ผ, ๋“ฑ๋ก์ž, ์ˆ˜์ •์ž ๋ชจ๋‘๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

@Component
public class LoginUserAuditorAware 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.getUserId());
    }
}

๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ •์ž, ๋“ฑ๋ก์ž๋Š” ๊ฐ’์ด ๊ทธ๋ƒฅ ๋“ค์–ด๊ฐˆ ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด ๋นˆ์„ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. getCurrentAuditor์˜ ๋กœ์ง์€ ํ˜„์žฌ ์œ ์ €๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์ด๋‹ค. SecurityContextHolder, HttpSession, AuthenticationToken ๋“ฑ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์™€์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์šด์˜๋  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์„œ๋น„์Šค๋Š” hibernate์˜ ZonedDateTime์„ ์‚ฌ์šฉํ•œ๋‹ค.

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class AbstractEntity {

    @CreationTimestamp
    private ZonedDateTime createdAt;

    @UpdateTimestamp
    private ZonedDateTime updatedAt;
}

Last updated