import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.reactive.function.client.WebClient;
import java.util.concurrent.CompletableFuture;

@Service
public class MyOptimizedService {

    @Autowired
    private MyRepository myRepository;

    @Autowired
    private CacheService cacheService;

    @Autowired
    private WebClient.Builder webClientBuilder;

    @Transactional
    public void optimizedMethod() {
        List<MyEntity> entitiesToSave = new ArrayList<>();

        // 캐시에서 데이터 가져오기 시도
        MyEntity cachedEntity = cacheService.getFromCache(key);
        if (cachedEntity != null) {
            // 캐시에 데이터가 있을 경우 로직 처리
        } else {
            // DB에서 데이터 가져오기
            List<MyEntity> fetchedEntities = myRepository.findAllByIds(ids);

            // 외부 API에서 데이터 가져오기
            CompletableFuture<MyExternalData> futureExternalData = webClientBuilder.build()
                    .get()
                    .uri("<https://external-api.com/data>")
                    .retrieve()
                    .bodyToMono(MyExternalData.class)
                    .toFuture();

            MyExternalData externalData = futureExternalData.join();  // 병렬 처리를 위해 CompletableFuture 사용

            // 외부 API에서 가져온 데이터를 로컬에서 처리 (예: Map을 사용)
            Map<String, Object> processedData = processExternalData(externalData);

            // 로직 처리 (DB + 외부 API 데이터를 이용)
            MyEntity updatedEntity = performBusinessLogic(fetchedEntities, processedData);

            // 변경된 엔터티를 리스트에 추가
            entitiesToSave.add(updatedEntity);

            // 캐시 업데이트
            cacheService.saveToCache(key, updatedEntity);
        }

        // 배치 저장
        myRepository.saveAll(entitiesToSave);
    }

    private Map<String, Object> processExternalData(MyExternalData externalData) {
        // 외부 데이터 처리 로직
        return new HashMap<>();
    }

    private MyEntity performBusinessLogic(List<MyEntity> fetchedEntities, Map<String, Object> processedData) {
        // 비즈니스 로직 처리
        return new MyEntity();
    }
}

<aside> 📌 근데 CompletableFuture 이거는 WebFlux에서 쓰는게 아니었나?

</aside>

<aside> 📌 그럼 Spring MVC 즉 @Controller, @RestController를 쓰는 프로젝트에서도 CompletableFuture 이건 자주 사용되는가?

</aside>

@Service
public class MyService {

    @Async
    public CompletableFuture<String> asyncMethod() {
        // 비동기로 처리할 로직
        return CompletableFuture.completedFuture("result");
    }
}