che01 님의 블로그
JPA Auditing 핵심 정리 본문
JPA Auditing 핵심 정리
1. 기본 기능: 생성/수정 날짜 자동 기록
- @CreatedDate : 엔티티가 생성될 때 자동으로 현재 시각을 기록
- @LastModifiedDate : 엔티티가 수정될 때 자동으로 현재 시각을 기록
- 이 기능들을 사용하려면 다음 3가지가 필요
- 엔티티(또는 부모클래스)에 @EntityListeners(AuditingEntityListener.class) 붙임
- 스프링 부트 메인 클래스나 설정 클래스에 @EnableJpaAuditing 붙여서 기능 활성화
- 날짜 필드는 LocalDateTime 타입 등으로 선언
- 이게 어떻게 가능한가?
- @EnableJpaAuditing → 기능 활성화
- Spring Boot가 실행될 때, 이 어노테이션을 통해 JPA Auditing 기능을 켭니다.
- 이걸 켜면 Spring이 내부적으로 Auditing 관련 이벤트를 감지할 준비를 합니다.
- @EntityListeners(AuditingEntityListener.class) → 이벤트 감지기 연결
- 해당 엔티티(또는 상속된 부모 클래스)에서 AuditingEntityListener를 리스너로 등록하면
- JPA가 persist(저장), update(수정) 시점에 이벤트를 발생시킬 때,
- 이 리스너가 그 시점을 잡아서 @CreatedDate, @LastModifiedDate 필드에 값을 자동으로 채워줘요.
- Spring이 자동으로 날짜 필드에 값을 넣어줌
- 위 리스너가 동작하면서 LocalDateTime.now() 같은 값을 자동으로 주입해줍니다.
- @EnableJpaAuditing → 기능 활성화
2. 작성자/수정자 자동 기록 (AuditorAware)
- @CreatedBy : 생성자 정보 자동 기록
- @LastModifiedBy : 수정자 정보 자동 기록
- 누가 작업했는지(작성자, 수정자) 자동으로 기록하려면
- AuditorAware<T> 인터페이스를 구현한 빈을 만들어야 함
- 이 구현체에서 보통 스프링 시큐리티 컨텍스트(SecurityContextHolder)에서 현재 로그인한 사용자 이름을 반환함
- 그리고 @EnableJpaAuditing(auditorAwareRef = "auditorAwareBeanName") 처럼 해당 빈 이름을 명시해 줘야 작동
- 이렇게 하면 보안상 누가 언제 뭘 했는지 추적 가능해짐 (감사 추적, audit trail)
4. 왜 AuditorAware를 만들고 사용하는가?
- “누가 만들고 수정했는지” 자동 기록을 위해서
- 보안상 변경 이력을 남기기 위해서(감사 추적)
- 로그인한 사용자 정보(스프링 시큐리티 SecurityContextHolder)를 JPA가 알 수 있게 해주기 위해서
- 관리자가 변경 이력을 추적하거나, 문제가 생겼을 때 책임 소재를 명확히 할 수 있게 하기 위해서