Persistable 을 이용한 쿼리 최적화

By | 2020년 12월 12일
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 를 실행하게 된다.

답글 남기기