1. AuditorAwareImpl
package com.shop.config;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Optional;
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);
}
}
2.AuditConfig
package com.shop.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
/** JPA의 Audiging 기능을 활성화 합니다.*/
@EnableJpaAuditing
public class AuditConfig {
/**
* 등록자와 수정자를 처리해주는 AuditorAware 을 빈으로 등록합니다.
*/
@Bean
public AuditorAware<String> auditorProvider (){
return new AuditorAwareImpl();
}
}
3.BaseTimeEntity
package com.shop.entity.base;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
/**
* Auditing 를 적용하기 위해서 @EntityListeners 어노테이션 추가
*/
@EntityListeners(value={AuditingEntityListener.class})
@MappedSuperclass
@Getter
@Setter
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime regTime;
@LastModifiedDate
private LocalDateTime updateTime;
}
4.BaseEntity
package com.shop.entity.base;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@EntityListeners(value={AuditingEntityListener.class})
@MappedSuperclass
@Getter
public abstract class BaseEntity extends BaseTimeEntity{
@CreatedBy
@Column(updatable = false)
private String createBy;
@LastModifiedBy
private String modifiedBy;
}
5.적용
package com.shop.entity;
import com.shop.constant.Role;
import com.shop.dto.MemberFormDto;
import com.shop.entity.base.BaseEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.security.crypto.password.PasswordEncoder;
@Entity
@Table(name = "member")
@Getter
@Setter
@ToString
public class Member extends BaseEntity {
@Id
@Column(name = "member_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
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.ROLE_USER);
//member.setRole(Role.ROLE_ADMIN);
return member;
}
}
6.테스트
package com.shop.repository;
import com.shop.entity.Member;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityNotFoundException;
import jakarta.persistence.PersistenceContext;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.TestPropertySource;
import org.springframework.transaction.annotation.Transactional;
@SpringBootTest
@Transactional
@TestPropertySource(locations = "classpath:application-test.properties")
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@PersistenceContext
EntityManager em;
@Test
@DisplayName("Auditing 테스트")
@WithMockUser(username = "gildong", roles = "USER")
public void audiginTest(){
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.getCreateBy());
System.out.println("modify member : "+member.getModifiedBy());
}
}
===>
register time : 2024-01-22T20:49:34.814453
update time : 2024-01-22T20:49:34.814453
create member : gildong
modify member : gildong
소스:
https://github.com/braverokmc79/jpa-shop-test2

















댓글 ( 0)
댓글 남기기