SpringBoot]ショッピングモールプロジェクト(9)-監査共有エンティティ属性の使用


レビューを使用してエンティティの汎用プロパティを汎用化


実際にサービスを実行すると、通常、登録時間、変更時間、登録者、および変更者がテーブルに配置され、利用されます.データの作成または変更時に時間を記録し、ユーザーのIDを残します.これらのコラムは、バグやコンサルティングが発生した場合に使用できます.
Spring Data Jpaは、エンティティが保存または変更されると、登録日、変更日、登録者、および変更者が自動的に入力される監査機能を提供します.Auditの事前定義は「監視」です.すなわち、エンティティの作成と変更を監視します.これらの共通メンバー変数を抽象クラスとして作成し、その抽象クラスを継承する形でエンティティを再編成します.
Auditor Awareインタフェースを実装するクラスを作成し、現在ログインしているユーザーの情報を登録者と変更者として指定します.
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);
    }

}
現在のログインユーザーの情報を表示し、登録者と変更者として名前を付けます.
監査機能を使用するには、Configファイルを作成します.
@Configuration
@EnableJpaAuditing
public class AuditConfig {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return new AuditorAwareImpl();
    }
}
@EnableJpaAuditing宣言JPAのAuditing機能が有効になっています.その後、AuditorAwareを空に登録して、登録者と変更者を処理します.

▼▼BaseTimeEntity類


登録者とテーブルに変更者が含まれていない可能性があるため、BaseTimeEntityクラスを作成してBaseTimeEntityを継承します.
@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Getter @Setter
public abstract class BaseTimeEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime regTime;

    @LastModifiedDate
    private LocalDateTime updateTime;

}
@MappedSuperclass宣言は、共通のマッピング情報が必要な場合に使用される宣言で、継承した親の子にのみマッピング情報を提供します.

✏️ BaseEntity


BaseEntityは、上記で作成したBaseTimeEntityを継承します.登録日、変更日、登録者、および変更者を持つエンティティは、BaseEntityを継承できます.
@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Getter
public abstract class BaseEntity extends BaseTimeEntity{

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String modifiedBy;

}
監査機能をメンバー・エンティティに適用するには、BaseEntityクラスを継承し、メンバー・エンティティを保存するときにテスト・コードを自動的に作成して、登録者、変更者、登録時間、および変更時間が保存されているかどうかを確認します.

✏️ MemberTest

@SpringBootTest
@Transactional
@TestPropertySource(locations="classpath:application-test.properties")
public class MemberTest {

    @Autowired
    MemberRepository memberRepository;

    @PersistenceContext
    EntityManager em;

    @Test
    @DisplayName("Auditing 테스트")
    @WithMockUser(username = "gildong", roles = "USER")
    public 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("modify member : " + member.getModifiedBy());
    }

}
残りのエンティティを変更してBaseEntityを継承します.