티스토리 뷰

 

프로젝트를 진행하면서 해당 데이터를 누가 생성하였는지, 언제 생성되었는지를 알아야 할 때가 있습니다.

 

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를 상속받았으며 등록 시간, 수정 시간, 생성자, 수정자를 알아보겠습니다.

 

이를 통해 잘 적용된 것을 확인할 수 있습니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함