스레드 :
- 스레드(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;
}
}
- @Async 애너테이션을 사용하여 MyService 클래스 내에서 asyncMethod() 메소드를 비동기적으로 실행할 수 있음
- 또한, AppConfig 클래스에서 AsyncConfigurer 인터페이스를 구현하여 getAsyncExecutor() 메소드를 오버라이딩하고, ThreadPoolTaskExecutor를 반환하는 방식으로 스레드 풀을 설정할 수 있음
비동기적으로 사용한다는 것은 어떤 의미일까?
- 작업을 수행하는 동안 해당 작업이 완료될 때까지 다른 작업을 수행할 수 있는 것을 말한다. 즉, 비동기적으로 실행된 작업은 다른 작업과 병행하여 실행될 수 있습니다.
- 예시 : 어떤 웹 애플리케이션이 있다고 가정했을때 이 애플리케이션에서 사용자가 로그인을 하면, 데이터베이스에서 해당 사용자 정보를 가져와서 로그인 여부를 판단한다.
- 동기적으로 실행했을 때 :로그인 여부가 판단될 때까지 다른 작업은 수행할 수 없. 이는 애플리케이션의 처리 속도를 늦추고, 사용자 경험을 저하시키는 문제를 야기할 수 있다.
- 비동기적으로 실행했을 때 : 사용자 정보를 가져오는 작업이 완료될 때까지 다른 작업을 수행할 수 있음. 이는 애플리케이션의 처리 속도를 향상시키고, 사용자 경험을 개선하는 데 도움이 됨
- 따라서, 비동기적으로 실행하는 것은 애플리케이션의 성능을 향상시키고, 사용자 경험을 개선하는 데 매우 중요하다. Spring Boot에서 @Async 애너테이션을 사용하여 메소드를 비동기적으로 실행할 수 있으며, 이를 통해 애플리케이션의 성능을 개선할 수 있다.
결국 비동기적 실행은 사용자 경험을 개선하는데 매우 중요한 역할을 한다.
사용자가 쾌적함을 느끼고 프로그램을 계속 사용하게 할 수 있다.
'파이널 프로젝트' 카테고리의 다른 글
[트러블슈팅] 통합검색에 대한 고찰 (1) | 2023.04.12 |
---|---|
[트러블슈팅] ISBN 검색속도 저하 문제 (0) | 2023.04.12 |
[SQL] 임계값이란 무엇인가? (0) | 2023.04.11 |
[MYSQL][Full-Text Search] 의 인덱스 (0) | 2023.04.11 |
[SQL] Full-Text Search란 무엇인가? (0) | 2023.04.11 |