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)
댓글 남기기