코루틴(Coroutine)은 일반적인 함수와 달리 실행을 중단하고, 다시 재개할 수 있는 특수한 함수. 함수 호출을 제어하는 유연성을 제공 -> 일반적으로 비동기 프로그래밍이나 병렬 작업에서 효율적 사용.
코루틴은 Lazy Evaluation: 호출되는 순간 즉시 실행되는 것이 아닌, 특정 조건이 충족되거나 호출될 때 실행.
코루틴을 중단하고 다시 실행하기 위해 yield 또는 await 같은 키워드 사용.
Java에서는 코루틴이라는 용어를 직접 사용하지는 않지만 비동기 작업을 효율적으로 수행할 수 있는 여러 가지 제공
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Void> future = CompletableFuture
.supplyAsync(() -> {
System.out.println("비동기 작업 수행 중...");
return "결과값";
})
.thenAccept(result -> System.out.println("결과: " + result));
// 메인 스레드가 종료되지 않도록 기다림
future.join();
}
}
import io.reactivex.rxjava3.core.Observable;
public class Main {
public static void main(String[] args) {
Observable<String> observable = Observable.create(emitter -> {
emitter.onNext("Hello");
emitter.onNext("RxJava");
emitter.onComplete();
});
observable.subscribe(item -> System.out.println("받은 데이터: " + item));
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread virtualThread = Thread.ofVirtual().start(() -> {
try {
Thread.sleep(1000); // 중단점
System.out.println("Virtual Thread 실행 완료");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
virtualThread.join();
}
}
Java에서 코루틴을 완벽히 대체하려면 Kotlin을 사용해야 한다. 코틀린은 Java와 100% 호환성을 유지하면서 코루틴을 기본적으로 제공.
Java는 직접적으로 "코루틴"을 지원하지 않지만, 아래의 실습 항목을 통해 코루틴과 유사한 비동기 처리 개념을 체험해볼 수 있습니다:
CompletableFuture
로 비동기 작업 실습import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 비동기 작업
System.out.println("API 호출 중...");
return "Hello, CompletableFuture!";
}).thenApply(result -> {
System.out.println("처리 중: " + result);
return result.toUpperCase();
}).thenAccept(result -> System.out.println("결과: " + result))
.join(); // 결과가 완료될 때까지 대기
}
}
Mono
와 Flux
를 활용한 비동기 데이터 스트림.@RestController
public class ReactiveController {
@GetMapping("/reactive")
public Mono<String> reactiveEndpoint() {
return Mono.just("Hello, WebFlux!")
.map(data -> data.toUpperCase());
}
}
Flux
)을 활용한 실시간 처리.public class VirtualThreadExample {
public static void main(String[] args) throws InterruptedException {
Thread virtualThread = Thread.ofVirtual().start(() -> {
try {
Thread.sleep(1000); // 중단
System.out.println("Virtual Thread 완료");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
virtualThread.join(); // 작업 대기
}
}
@RestController
class CoroutineController {
@GetMapping("/coroutine")
suspend fun getCoroutine(): String {
delay(1000L) // 중단 가능
return "Hello, Coroutine!"
}
}
launch
와 async
를 활용한 비동기 병렬 처리.API 호출 최적화
파일 처리
실시간 데이터 처리
Virtual Thread 성능 비교
Thread
와 Virtual Thread를 비교하는 벤치마크.@Async
어노테이션을 활용해 비동기 처리를 간단히 구현.CompletableFuture
로 비동기 DB 조회 및 처리 실습.이런 실습을 통해 비동기 프로그래밍과 코루틴 개념을 체험하며 Java 백엔드 개발 역량을 강화할 수 있습니다. 👍