자바 버추얼 쓰레드와 코틀린의 유사한 기능인 코루틴을 비교하고, 장점과 성능 향상 및 생산성, 에러 수준 등을 정리
Go의 goroutine이 대표적인 경량 쓰레드 모델.기존 언어의 모델쓰레드보다 더 작은 단위로 실행 단위를 나눠 컨텍스트 스위칭 비용과 Blocking 타임을 낮추는 개념. 쓰레드는 OS 차원에서 1MB의 메모리를 할당하기 때문에 쓰레드가 많아지면 과도한 메모리 낭비와 컨테스트 스위칭, 블로킹 타임이 문제가 됨.
쓰레드를 맹신하여 서버에서 쓰레드를 남발할 경우 CBT, OBT에 문제없던 온라인 게임이 동접이 붙으면 답없어지는 경우가 바로 쓰레드가 잡아 먹는 리소스가 적지 않다는 걸 간과한 결과임.
자바 버추얼 쓰레드 (Java Virtual Threads)
장점
1. 경량화된 스레드:
• 버추얼 쓰레드는 운영체제(OS) 스레드와 1:1 매핑되지 않고, 경량화된 스레드로 동작한다.
• 수백만 개의 버추얼 쓰레드를 동시에 생성할 수 있다.
• JVM에서 OS 레벨의 Thread와 그 쓰레드 안에 논리적 쓰레드를 사용하여 부하를 낮춤
2. 블로킹 I/O 처리:
• 버추얼 쓰레드는 블로킹 I/O 작업을 효율적으로 처리하며, 스레드가 블로킹될 때 다른 버추얼 쓰레드로 교체한다.
3. 성능 향상:
• 더 적은 메모리로 더 많은 동시 실행을 지원
• 컨텍스트 스위칭 비용이 감소
4. 간단한 코드:
• 기존의 동기식 코드 스타일을 유지하면서도 고성능 비동기 처리가 가능.
• 버추얼쓰레드 코드를 도입할 경우 기존 코드를 거의 변경하지 않아도 좋을 정도
5. 유지보수 용이:
• 비동기 코드에 비해 읽기 쉽고 디버그하기 쉬운 동기식 코드를 작성할 수 있음.
자바 버추얼 쓰레드 사용 예
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class VirtualThreadExample {
public static void main(String[] args) throws InterruptedException {
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 1000; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread());
try {
Thread.sleep(1000); // 블로킹 작업
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
}
}
}
• 설명:
1000개의 버추얼 쓰레드를 생성해 각 쓰레드가 1초간 슬립하는 블로킹 작업을 수행. 메모리 및 CPU 리소스를 효율적으로 사용.
코틀린 코루틴 (Kotlin Coroutines)
장점
1. 경량화된 비동기 처리:
• 코루틴은 경량화된 스레드와 비슷하지만 스레드보다 훨씬 효율적
2. 비동기 코드의 간결함:
• 비동기 처리를 동기식 코드처럼 작성할 수 있어 가독성이 좋음.
3. 구조적 동시성:
• 코루틴은 부모-자식 관계를 통해 작업을 쉽게 관리하고 취소할 수 있음.
4. 성능 향상:
• 많은 동시 작업을 메모리 효율적으로 실행할 수 있음.
코틀린 코루틴 사용 예
import kotlinx.coroutines.*
fun main() = runBlocking {
repeat(1000) {
launch {
println(Thread.currentThread())
delay(1000) // 비동기 블로킹 작업
}
}
}
코루틴이 코드가 획기적으로 간결하다. 코틀린이라는 언어의 지향점이 잘 나타난 부분이 코루틴이라고 생각한다. 생산성이 좋고 유지보수가 좋다면 다소 성능이 떨어지더라도 개발에서 사용하는 것이 당영하다. 코루틴은 생산성과 유지보수 관점에서 거부할 명분이 없다.
• 설명:
1000개의 코루틴을 생성해 각 코루틴이 1초간 딜레이합니다. 메모리 및 CPU를 효율적으로 사용.
자바 버추얼 쓰레드와 코틀린 코루틴 비교
비교 항목 자바 버추얼 쓰레드 코틀린 코루틴
주의할점
• 클라우드를 많이 사용하는데, 가능하다면 vCore가 넉넉한 환경에서 사용하라. 아무리 버추얼 쓰레드, 코루틴이라도 실제로 쓰레드를 사용하기 때문에 CPU가 여유가 있어야 한다.
• 코드에 따라 극적으로 성능 향상은 이루어지지 않는다. 데이터베이스에 캐싱 없이 쿼리가 버추얼 쓰레드, 코루틴 안에 호출이 빈번할 경우 병목을 제거하고 캐싱할 방법을 MQ를 쓰던 redis를 쓰던 찾아야한다.
결론
• 자바 버추얼 쓰레드는 기존 동기식 코드 스타일을 유지하면서 많은 동시 작업을 효율적으로 처리하고 싶을 때 적합.
• 코틀린 코루틴은 비동기 프로그래밍을 간결하게 작성하고, 구조적 동시성을 활용하고 싶을 때 유용
코틀린을 사용한다면 코루틴으로 작성하는 것이 코드 유지보수, 가독성, 성능면에서 좋은 선택지.
적극 써라.
기술적인 내용이 더 궁금하다면: https://techblog.woowahan.com/15398/