코드 그라데이션

shop 구현 (6) Auditing 본문

Spring/SpringShop

shop 구현 (6) Auditing

완벽한 장면 2023. 7. 12. 19:18

언제 저장했는지, 언제 변경했는지 / 누가 저장했는지, 누가 변경했는지 

에 대한 정보는 엔티티 관계없이 모두가 들고 있다.

 

그런데 어떤 엔티티는 등록자/수정자가 의미 없을 수도 있고,

어떤 엔티티는 등록/수정시간이 의미 없을 수도 있다.

이런 걸 구분하기 위해서...

 

지금 교재에는 BaseTime entity가 부모로 있는 걸 봐서

등록자/수정자가 관심 없는 상태이다.

 

둘 다 궁금한 상태이면 BaseEntity를 붙여주면 된다.

 

감시의 힘은?

만약 없다면 이것들을 어떻게 처리해야 하는가.

- 쿼리 날릴 때 이 정보들을 알려주던가(할때마다 일일이 로직 추가)

- 등록자 수정자는 항상 들고와야하는데? 어디서? 업데이트하는 값이기 때문에((주로 사용자로부터 옴)  사용자로부터 연결된 컨트롤러에서 온다. 장시간 들고있어야 하기 때문에 비효율적.

 

그런

  @Override
  public Optional<String> getCurrentAuditor() {
    // Optional 클래스는 아래와 같은 value에 값을 저장하기 때문에 
    // 값이 null이더라도 바로 NullPointError가 발생하지 않으며,
    // 클래스이기 때문에 각종 메서드를 제공한다.
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    String userId = "";
    if (authentication != null) {
      // 현재 로그인 한 사사용자의 정보를 조회하여 사용자의 이름을 등록자와 수정자로 지정.
      userId = authentication.getName();
    }
    return Optional.of(userId);
  }

AuditConfig 에서 AuditAware을 만들어 구현을 할 때 CreatedBy, ModifiedBy 등의 어노테이션이 붙어있을 때, 자동으로 정보를 확인을 해서 그 사람의  이름을 쓰게 하면, 

일일이 들고다니는 게 아니라, 저장하는 시점에 .getName() 메서드가 호출이 되어서 그 때 시큐리티 홀더에 저장이 되어있던 사용자의 정보를 읽어와서 세팅을 해준다.

 


Optional

- 무언가를 감싸는 용도

- 옵셔널 자체도 객체라서, 오버헤드는 있다.

- findBy 하면 기본 리턴이 Optional이다. 컨벤션임.

 

MappedSuperClass

- 다른 애의 부모로서 만든 거니까 테이블은 만들지마. 

728x90
Comments