회사에서 데이터 마이그레이션 위한 Update 문을 추출하는 작업이 있었습니다. 수십만 건의 데이터를 외부 API를 호출하는 로직이 포함되어 있었습니다. 가장 단순한 방법은 for 루프를 돌며 데이터를 하나씩 순차적으로 처리하는 것입니다. 하지만 이 방식은 I/O 작업이 대부분인 경우 엄청나게 비효율적이며, 하염없이 기다려야 하는 고통의 시간이 시작됩니다. 외부 API를 호출할때 Thread를 여러개 만들어서 병렬로 호출해서 시간을 단축하려고 했으나, Java 21의 새로운 기능인 가상 스레드(Virtual Threads)를 사용해보고 싶어서 적용해보았습니다. 이 글에서는 단순한 for 루프를 사용한 순차 처리 방식이 왜 느린지 알아보고, 이를 Java 21의 가상 스레드와 Semaphore를 이용해 어..