Aop관련한 자세한 설명은 다음 자료를 참고하자
https://harmony-raccoon.tistory.com/22
Spring에서 AOP로 Log 기능 구현하기
서버에서 Log 기능은 매우 중요합니다. 예상치 못한 에러로 인해 서버가 다운되거나, 유저 요청이 특정 로직을 통과하지 못했을 때 Log를 통해 데이터를 복구하고 원인을 분석할 수 있습니다.그렇
harmony-raccoon.tistory.com
AOP에서 지원하고 있는 기능 중 하나는 MultiThread 구현이다.
MultiThread를 구현하는 어노테이션은 @Async이다.
@Async
Async는 Spring에서 MultiThread를 도입하기 위해서 필요한 어노테이션이다.
Async를 이용해서 MultiThread를 도입하기 위한 방법은 크게 어노테이션만 달기, Configuration 작성 2가지로 구분된다.
Annotation만 달기
1. Application.java 클래스에 @EnableAsync라는 어노테이션을 달아준다.
@EnableAsync
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
}
2. 그 후, MultiThread기능을 달고 싶은 메서드에 @Async라는 어노테이션을 달아준다.
@Service
@Slf4j
public class AsyncService {
@Async
public void log() throws InterruptedException {
log.info("{} 쓰레드 작업 시작", Thread.currentThread().getId());
Thread.sleep(100);
log.info("{} 쓰레드 작업 종료", Thread.currentThread().getId());
}
}
이렇게만 하면 끝이다.
그럼 위 log()라는 메서드가 실행될 때, MultiThread가 생성되어 실행된다.
테스트코드는 다음과 같다.
@SpringBootTest
class AsyncServiceTest {
@Autowired
AsyncService asyncService;
@Test
@DisplayName("멀티쓰레드 확인")
void testMultiThread() throws InterruptedException {
for(int i = 0; i < 20; i++) {
asyncService.log();
}
}
}
위의 테스트 코드를 실행하면 결과는 다음과 같다.
이렇게 쓰레드가 OS 자체의 Scheduling에 따라서 실행되고 있다는 것을 알 수 있다.
Configuration 작성
1. Configuration 클래스 생성 및 @Configuration, @EnableAsync 어노테이션 달아준다. (이때, 위에서 Application.java 파일에 달았던 @EnableAsync는 삭제해도 똑같이 작동한다.)
@EnableAsync
@Configuration
public class AsyncEx {
}
2. 그 후, MultiThread기능을 달고 싶은 메서드에 @Async라는 어노테이션을 달아준다.
@Service
@Slf4j
public class AsyncService {
@Async
public void log() throws InterruptedException {
log.info("{} 쓰레드 작업 시작", Thread.currentThread().getId());
Thread.sleep(100);
log.info("{} 쓰레드 작업 종료", Thread.currentThread().getId());
}
}
이렇게 하면 Configuration을 이용한 MultiThread 기능 사용은 끝이다.
내가 작성한 테스트코드는 위에서 알아보았던 코드와 일치한다. 위의 테스트 코드를 다시 작동하면 결과는 다음과 같다.
ThreadPool 사용
위에서 작성하였던 Configuration에 ThreadPool을 도입해서 개발자 직접 Thread의 개수, Task Queue의 크기 지정 등 Thread 설정을 할 수 있다.
Configuration 코드를 다시 보면 다음과 같다.
@EnableAsync
@Configuration
public class AsyncEx {
@Bean(name = "multiThread Ex") // 이름을 설정하면, 해당하는 이름을 가진 @Async 어노테이션에만 이 쓰레드 설정이 적용.
public Executor multiThreadExecutor() {
ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
poolExecutor.setCorePoolSize(10); // 최소 쓰레드 수
poolExecutor.setMaxPoolSize(100); // 최대 쓰레드 수
poolExecutor.setQueueCapacity(100); // 쓰레드 이상의 작업 요청이 있다면, 이 Queue 에 저장한 후 쓰레드가 종료되면 여기서 작업을 꺼내서 다시 실행.
// 이 Queue 크기를 설정
poolExecutor.setThreadNamePrefix("MultiThread -"); // 쓰레드 실행시 이름을 설정
poolExecutor.initialize();
return poolExecutor;
}
}
이렇게 설정한 후, 다시 테스트 코드를 돌리면 결과는 다음과 같다.
위의 이미지와 다른 점은 Spring 자체에서 Thread로그를 찍을 때, Task가 아닌 우리가 설정한 MultiThread로 시작한다는 점이다.
즉, 위의 설정이 제대로 작동하고 있다.
참고 자료
https://cano721.tistory.com/208
[Spring] @Async 비동기 멀티스레드 사용법
수정사항 2022-08-27 async 사용 시 비동기 스레드 exception 처리 CompletableFuture 사용법 추가 Async 사용계기 현재 마이다스 AI 역검 백엔드팀에 들어오게 되었는데, 과제 중 원활한 검증작업을 위한 응시
cano721.tistory.com
https://320hwany.tistory.com/107
Spring에서 멀티 쓰레드 비동기 프로그래밍 해보기
Spring은 기본적으로 멀티 쓰레드, 동기 방식으로 작동합니다. 하지만 성능 향상을 위해서 비동기 방식으로 작동을 하도록 할 수 있습니다. 이번 글에서는 싱글 쓰레드/멀티 쓰레드, 동기/비동기
320hwany.tistory.com
스프링 @Async를 이용한 비동기 실행 적용하기
Spring Async@Async비동기 실행을 위한 @Async를 사용하기 위해서는 먼저 적당한 @Configuration 클래스에 @EnableAsync를 추가해주어야 합니다.@EnableAsync @Configuration public class AsyncConfig {}그런 다음 비동기적으
hseong.tistory.com
혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!
'Spring > AOP' 카테고리의 다른 글
Spring에서 AOP로 Log 기능 구현하기 (0) | 2024.12.13 |
---|