์ํฐํฐ ์์ฑ, ๋ณ๊ฒฝ ์ ์๊ฐ์ด๋ ์์ ์๊ฐ์ ํ๋๋ ๋ชจ๋ ์ํฐํฐ์์ ๊ณตํต์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ฐ๋ผ์ ๊ณตํต์ผ๋ก ๋ฑ๋กํ ๋ค์ 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;
}