스레드 :

  • 스레드(thread)는 컴퓨터 프로그래밍에서 실행 중인 프로세스 내에서 실행되는 작업의 가장 작은 단위. 각각의 스레드는 프로세스 내에서 별도의 실행 경로를 가지며, 여러 개의 스레드가 동시에 실행될 수 있다.
  • 스레드는 프로그램의 성능을 향상시키는 데 중요한 역할을 한다. 예를 들어, 한 프로세스 내에서 여러 개의 스레드를 사용하면 여러 작업을 동시에 처리하거나, 한 작업을 분할하여 병렬적으로 처리함으로써 처리 속도를 높일 수 있다. 스레드를 사용하면 프로그램의 응답성도 향상다. 스레드를 사용하지 않고 하나의 실행 경로로 처리하면, 하나의 작업이 끝날 때까지 다른 작업을 처리할 수 없다. 하지만 스레드를 사용하면 여러 작업을 동시에 처리할 수 있기 때문에, 사용자 입력에 더 빠르게 응답할 수 있게된다.
  • 스레드는 프로그래밍 언어에 따라 구현 방법이 다를 있지만, 일반적으로 스레드 생성, 스레드 동기화, 스레드 스케줄링 등을 지원한다고 한다.

멀티스레드

  • 멀티 스레드(multi-thread)는 하나의 프로세스에서 여러 개의 스레드를 동시에 실행하는 것이다. 즉, 멀티 스레드 프로그래밍은 여러 개의 작업을 동시에 수행할 수 있는 병렬처리(parallel processing) 방식 중 하나.
  • 멀티 스레드를 사용하면, 프로그램이 더욱 효율적으로 동작할 수 있다. 예를 들어, 네트워크 서버 프로그램에서는, 클라이언트의 요청을 처리하는 스레드와 동시에 다른 클라이언트의 요청을 대기하는 스레드를 사용하여, 여러 클라이언트 요청을 동시에 처리할 수 있다. 이렇게 하면, 대기 시간이 줄어들고, 서버의 처리 속도와 응답성이 향상된다.
  • 멀티 스레드 프로그래밍은 스레드 간의 동기화와 관련된 문제들을 해결해야 하는 등의 어려움도 있지만, 성능과 응답성을 향상시키는 등의 장점이 있기 때문에, 현대의 프로그래밍에서는 매우 중요한 기술 하나입니다.

프로젝트 적용 방법

  • 지도에서 위치 정보를 표시하는 프로그램은 보통 많은 양의 데이터를 처리하고, 또한 사용자와의 상호작용도 처리해야 하기 때문에 멀티스레드를 활용하는 것이 필요하다.
  • 상황1 : 사용자가 지도를 확대하거나 축소하거나 이동할 때마다, 지도를 다시 그리는 작업이 필요.
    • 이 때, 이 작업을 담당하는 스레드를 따로 두면, 다른 스레드에서는 데이터를 처리하거나 사용자 입력을 처리하는 등 다른 작업을 계속할 수 있습니다. 이렇게 하면, 지도를 다시 그리는 작업 때문에 다른 작업이 느려지거나 멈추는 일이 없이, 지도 화면이 부드럽게 갱신될 수 있습니다.
  • 상황2 : 지도 데이터를 다운로드하거나 처리하는 작업 역시 많은 시간이 소요될 수 있음
    • 이러한 작업들은 별도의 스레드에서 수행함으로써, 지도를 표시하는 작업과 동시에 수행될 수 있다.
    • 이를 통해, 지도를 빠르게 표시할 수 있습니다.
  • 상황3 : 사용자의 위치와 도서관의 위치 받아와서 표시하기
    • 다수의 사용자들이 각자의 위치가 표시된 자료를 각각 다운받고 가장 가까운 도서관에 대한 위치정보도 다운받아야 한다.
    • 이때 각자의 위치를 표시하는 스레드 하나, 도서관 정보에 대한 스레드 하나 등 따로 구현하면 더 빠르게 작업할 수 있지 않을까?

 

추가 공부 스프링 부트에서 멀티스레드 사용하는 법

1. @Async 애너테이션 추가

@Service
public class MyService {

    @Async
    public void asyncMethod() {
        // 비동기적으로 실행되는 작업
    }
}

2. ThreadPoolTaskExecutor 설정

 

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {
 
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 스레드 풀의 기본 크기 설정
        executor.setMaxPoolSize(10); // 스레드 풀의 최대 크기 설정
        executor.setQueueCapacity(25); // 작업 큐의 크기 설정
        executor.initialize();
        return executor;
    }
}
  1. @Async 애너테이션을 사용하여 MyService 클래스 내에서 asyncMethod() 메소드를 비동기적으로 실행할 있음
  2. 또한, AppConfig 클래스에서 AsyncConfigurer 인터페이스를 구현하여 getAsyncExecutor() 메소드를 오버라이딩하고, ThreadPoolTaskExecutor 반환하는 방식으로 스레드 풀을 설정할 있음

 

비동기적으로 사용한다는 것은 어떤 의미일까?

  1. 작업을 수행하는 동안 해당 작업이 완료될 때까지 다른 작업을 수행할 있는 것을 말한다. , 비동기적으로 실행된 작업은 다른 작업과 병행하여 실행될 있습니다.
    1. 예시 : 어떤 애플리케이션이 있다고 가정했을때 이 애플리케이션에서 사용자가 로그인을 하면, 데이터베이스에서 해당 사용자 정보를 가져와서 로그인 여부를 판단한다.
    2. 동기적으로 실행했을 때 :로그인 여부가 판단될 때까지 다른 작업은 수행할 없. 이는 애플리케이션의 처리 속도를 늦추고, 사용자 경험을 저하시키는 문제를 야기할 있다.
    3. 비동기적으로 실행했을 때 : 사용자 정보를 가져오는 작업이 완료될 때까지 다른 작업을 수행할 있음. 이는 애플리케이션의 처리 속도를 향상시키고, 사용자 경험을 개선하는 도움이 됨
  2. 따라서, 비동기적으로 실행하는 것은 애플리케이션의 성능을 향상시키고, 사용자 경험을 개선하는 매우 중요하다. Spring Boot에서 @Async 애너테이션을 사용하여 메소드를 비동기적으로 실행할 있으며, 이를 통해 애플리케이션의 성능을 개선할  있다.

결국 비동기적 실행은 사용자 경험을 개선하는데 매우 중요한 역할을 한다. 

사용자가 쾌적함을 느끼고 프로그램을 계속 사용하게 할 수 있다. 

 

 

 

 

 

+ Recent posts