본문 바로가기

개발/Spring

[Spring] 비동기 처리에 대한 이해(1) - 쓰레드

기본적으로 "스프링을 사용한다" 하면 대부분 Spring MVC를 이야기하는 것이고,

이는 동기(Synchronous)적 처리방식을 주로 사용한다는 것을 의미하기도 한다.

 

동기 처리방식은 순차적으로 동작하기 때문에, 코드를 파악하기 쉽고, 디버깅이 수월하다는 장점이 있다.

문제는 특정 작업을 실행하는 동안 해당 작업이 종료되기 전에 다른 작업을 진행할 수가 없다는 점이다.

 

스레드가 1개인 경우를 싱글 쓰레드(Single Thread), 둘 이상 존재하는 경우 멀티 쓰레드(Multi Thread) 라고 하고,

Spring MVC 에서는 쓰레드의 갯수로 여러 작업을 비동기적으로 처리한다.

(멀티 쓰레드 환경에서 스케줄링에 의해 쓰레드가 전환되면서 작업을 처리하는 것을 "컨텍스트 스위칭" 이라 한다)\


일단 코틀린으로 멀티 쓰레드를 생성해 출력해보자

fun main() {
    for (i in 0..5) {
        val thread = Thread({
            println("current-thread-name : ${Thread.currentThread().name}")
        })
        thread.start()
    }
    println("current-thread-name : ${Thread.currentThread().name}")
}

결과


하지만 쓰레드를 무한정으로 사용할 수는 없다. 메모리의 사용량이 증가함에 따라 OOM(Out Of Memory) 에러가 발생할 수도 있고, 쓰레드 생성에 대한 비용도 있기 때문이다.

 

따라서 스프링에서는 쓰레드 풀(Thread Pool) 방식을 사용해, 서버 실행시 미리 일정 수의 쓰레드를 생성하고, 운영시에 재사용하는 방식으로 되어 있다.

 

스프링은 아니지만, ExecutorService를 사용해 쓰레드 풀을 사용해보자.

fun main() {
    val pool: ExecutorService = Executors.newFixedThreadPool(5)
    try {
        for (i in 0..5) {
            pool.execute {
                println("current-thread-name : ${Thread.currentThread().name}")
            }
        }
    } finally {
        pool.shutdown()
    }
    println("current-thread-name : ${Thread.currentThread().name}")
}

아래 결과를 보면 같은 쓰레드 풀을 재사용하는 것을 확인할 수 있다.


동기방식의 메커니즘 환경에서 멀티 쓰레드를 활용해 비동기 처리를 수행하는 방식에 대해 간단하게 알아보았다.

다음에는 비동기 작업에 대한 결과를 얻기 위한 Future 에 대해 알아보고자 한다.

 

출처 : 실무 프로젝트로 배우는 Kotlin & Spring : 리팩토링부터 서비스 구현까지, 패스트캠퍼스 (https://fastcampus.co.kr/courses/211160)

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr