Table of Contents
Persistable 을 이용한 쿼리 최적화
문제점
@RequiredArgsConstructor
@Service
public class CurrentStockSummaryService {
private final CurrentStockSummaryRepository currentStockSummaryRepository;
@Transactional
public void addIpgo(String skuCd, int diffCount) {
CurrentStockSummary currentStockSummary = getOne(skuCd);
// ......
currentStockSummaryRepository.save(currentStockSummary);
}
private CurrentStockSummary getOne(String skuCd) {
return currentStockSummaryRepository.findById(skuCd).orElse(new CurrentStockSummary(skuCd));
}
}
위에서 Repository.findById()
에 의해 데이타의 존재여부를 확인할 수 있음에도, Repository.save()
에서 또 다시 select
를 수행하는 것을 확인할 수 있다.
해결책
@Setter
@Getter
@NoArgsConstructor
@Entity
@Table(name = "tbl_current_stock_summary", catalog = "db_summary")
public class CurrentStockSummary extends BaseTimeEntity implements Persistable<String> {
@Id
private String skuCd;
// ......
@Override
public String getId() {
return skuCd;
}
@Override
public boolean isNew() {
return getRegdate() == null;
}
}
위에서 엔터티에 Persistable
를 추가하고, getId()
, isNew()
를 구현해 줌으로 해서 반복적인 select
대신, 즉시 insert
를 실행하게 된다.