티스토리 뷰
프로젝트를 진행하면서 해당 데이터를 누가 생성하였는지, 언제 생성되었는지를 알아야 할 때가 있습니다.
JPA에서 Auditing 기능을 제공하여 Entity가 등록된 시간, 수정된 시간, 등록한 사람. 수정한 사람을 자동으로 입력해 줍니다.
이제 이를 적용해 보겠습니다.
0. AuditorAwareImpl 생성
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String userId = "";
if(authentication != null){
userId = authentication.getName();
}
return Optional.of(userId);
}
}
현재 로그인한 사용자의 정보를 등록자와 수정자로 등록하기 위해 AuditAware이란 인터페이스를 구현한 클래스를 생성하였습니다.
+) AuditAware
public interface AuditorAware<T> {
/**
* Returns the current auditor of the application.
*
* @return the current auditor.
*/
Optional<T> getCurrentAuditor();
}
AuditorAware는 getCurrentAuditor이란 클래스를 포함하며 이를 통해 현재 사용자를 반환해 줍니다.
위의 이 기능을 사용하기 위해 Configuration을 통해 설정하겠습니다.
1. AuditConfig 생성
@Configuration
@EnableJpaAuditing
public class AuditConfig {
@Bean
public AuditorAware<String> auditorAware(){
return new AuditorAwareImpl();
}
}
EnableJpaAuditing을 통해 Audit 기능을 활성화합니다.
위에서 설정한 클래스를 Bean으로 설정합니다.
2. BaseTimeEntity
@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Getter
@Setter
public abstract class BaseTimeEntity { //상속만 받게 하기 위해서
@CreatedDate
@Column(updatable = false)
private LocalDateTime regTime;
@LastModifiedDate
private LocalDateTime updateTime;
}
생성된 시간을 알기 위해 regTime을, 수정된 시간을 알기 위해 updateTime을 설정하였습니다.
- CreatedDate는 생성되어 저장될 때의 시간을 저장합니다.
- LastModifiedDate는 값이 변경될 때의 시간을 저장합니다.
클래스 생성 후 @EntityListners를 통해 AuditingEntityListnerclass.class를 선언하여 Auditing을 적용합니다.
3. BaseEntity
@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Getter
public abstract class BaseEntity extends BaseTimeEntity{
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String modifiedBy;
}
BasEntity 또한 추상 클래스로 하여 BaseTimeEntity를 상속받도록 하였습니다.
이번에는 등록 / 수정한 사람의 정보를 createBy, modifiedBy에 담겠습니다.
4. 이를 적용하려는 Entity
@Entity
@Table(name="member")
@Getter
@Setter
@ToString
public class Member extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="member_id")
private Long id;
private String name;
@Column(unique = true)
private String email;
private String password;
private String address;
@Enumerated(EnumType.STRING)
private Role role;
public static Member createMember(MemberFormDto memberFormDto, PasswordEncoder passwordEncoder){
Member member=new Member();
member.setName(memberFormDto.getName());
member.setEmail(memberFormDto.getEmail());
member.setAddress(memberFormDto.getAddress());
String password= passwordEncoder.encode(memberFormDto.getPassword());
member.setPassword(password);
member.setRole(Role.USER);
return member;
}
}
이를 적용하려는 Entity에 extends BaseEntity를 통해서 적용할 수 있습니다.
Member 뿐만 아니라 다양한 Entity에 이를 적용하였습니다.
잘 작동되는지 확인해 보겠습니다.
5. MemberTest를 통해 Auditing 확인
@SpringBootTest
@Transactional
public class MemberTest {
@Autowired
MemberRepository memberRepository;
@Autowired
EntityManager em;
@Test
@DisplayName("Auditing 테스트")
@WithMockUser(username="user1", roles="USER")
void auditingTest(){
Member newMember=new Member();
memberRepository.save(newMember);
em.flush();
em.clear();
Member member=memberRepository.findById(newMember.getId())
.orElseThrow(EntityNotFoundException::new);
System.out.println("register time: "+ member.getRegTime());
System.out.println("update time: "+member.getUpdateTime());
System.out.println("create member: "+member.getCreatedBy());
System.out.println("update member: "+ member.getModifiedBy());
}
}
Member에도 BaseEntity를 상속받았으며 등록 시간, 수정 시간, 생성자, 수정자를 알아보겠습니다.
이를 통해 잘 적용된 것을 확인할 수 있습니다.
'server > Spring' 카테고리의 다른 글
[Spring Data JPA] QueryDSL 적용하기 (1) | 2023.04.22 |
---|---|
Github Action 시 발생했던 contextLoads() 에러 해결 방법 (0) | 2023.04.19 |
Spring Boot + S3 사진 파일 업로드 (0) | 2023.04.08 |
Spring Security를 이용한 비밀번호 암호화 (0) | 2023.03.18 |
[spring] 프로젝트 기초 세팅 (0) | 2022.10.25 |
- Total
- Today
- Yesterday
- AWS
- RDS
- 시스템콜
- ubuntu
- 실패율
- 최솟값구하기
- dp
- 이진변환반복하기
- Android
- 최고의집합
- 영어끝말잇기
- 괄호회전하기
- springboot
- interrupt
- 우분투설치
- 프로그래머스
- 응답코드
- 프리티어
- 정수삼각형
- 백준
- 운영체제
- PasswordEncoder
- 다음큰숫자
- OS
- qemu
- PostgreSQL
- Auditing
- xv6
- 뉴스클러스터링
- 머신러닝
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |