코드 그라데이션
shop 구현 (6) Auditing 본문
언제 저장했는지, 언제 변경했는지 / 누가 저장했는지, 누가 변경했는지
에 대한 정보는 엔티티 관계없이 모두가 들고 있다.
그런데 어떤 엔티티는 등록자/수정자가 의미 없을 수도 있고,
어떤 엔티티는 등록/수정시간이 의미 없을 수도 있다.
이런 걸 구분하기 위해서...
지금 교재에는 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
- 다른 애의 부모로서 만든 거니까 테이블은 만들지마.
'Spring > SpringShop' 카테고리의 다른 글
shop 구현 (8) 상품 수정하기 / 변경감지 (0) | 2023.07.14 |
---|---|
shop 구현 (7) 상품 등록 (0) | 2023.07.13 |
shop 구현 (5) 고아객체 제거, 즉시 로딩과 지연 로딩 (0) | 2023.07.12 |
shop 구현 (4) 연관관계 매핑 (0) | 2023.07.11 |
shop 구현 (3) Entity, Dto, Service 계층 + QueryDsl (0) | 2023.07.09 |