일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 비주얼 스튜디오 코드
- java Optional
- AWS 프로젝트
- spring async
- Visual Studio Code
- 자바 스트림
- 창업 마인드
- 창업형인간
- CI/CD
- java null 처리
- AWS 키페어
- AWS 프로젝트 올리기
- optional
- vscode
- AWS
- Optional 사용법
- java stream
- 라이프해킹스쿨
- @async
- dockerfile
- 창업형인간되기
- AWS S3
- spring multi thread
- AWS EC2
- ssh
- AWS ssh
- github CI/CD
- 스트림 예제
- 마인드
- 창업
- Today
- Total
Wookim
spring Async(비동기, 멀티스레드) 메소드 적용하기(1) 본문
스프링 비동기 메소드 적용하기
스프링에 비동기 메소드를 적용해보자.
적용 이유
특정 데이터를 매우 비효율적으로 조회하여 특정 로직을 태워야 하는 상황이다.
가능 하다면 다른 방식으로 해결해야 하는 상황이지만, 여건상 성능도 고려하며 빠르게 해결해야 했다.
이런 상황에서 해당 메소드를 비동기(멀티스레드) 처리하고
기존에 다른 기능에 문제가 없도록 설정해야 했다.
미리 알고 가기
스프링의 @Async 애너테이션으로 비동기 처리를 할 때 주의점부터 알고가자
1. @Async를 적용한 메소드는 public 이어야 한다.
2. @Async 메소드를 구현한 class에서 내부 호출(self-invocation )은 불가하다.
이유는?
참고한 문서에 자세한 내용은 설명되있지 않지만
문맥상 추측하자면 다음과 같다.
1. 프레임워크에서 해당 메소드들은 proxy를 통해 관리되는것 같다.
즉 @Async 메소드들을 호출하려면 proxy를 통해 호출하고 관리된다.
그렇기 때문에 접근 제한자는 public 이어야 한다. (proxy가 접근 할 수 있도록)
proxy 프록시란?
프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다. - 위키백과
A -> B 로 통신 요청이 오고 갈 때
A -> proxy -> B 중간 매개체 역할을 하여 특정 로직등 처리를 하는 미들웨어 정도라 생각하면 될것같다.
- by wookim
2. @Async 메소드들 구현한 클래스에서 내부 호출을 사용하면
해당 proxy를 거치지 않기 때문에 문제가 된다. (proxy에 의해 관리되지 않음)
그렇기 때문에 내부호출은 금지된다.
@Async 메소드의 2가지 적용 레벨
1. 메소드 단위
2. 어플리케이션 단위
1. 메소드 단위는 async config 파일에 특정 이름으로 등록한 빈을 사용한다.
@Async(name ="빈 이름")
public void method()....
해당 메소드는 proxy에 의해 호출되고 별도의 스레드에서 실행(execute in a separate thread)된다.
2. 어플리케이션 단위는 async config 파일에 AsyncConfigurer 인터페이스를 구현해야 한다.
@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
return new ThreadPoolTaskExecutor();
}
}
그리고 getAsyncExcutor() 메소드를 orverrid 해야 한다.
@Async 애너테이션을 메소드에 적용하면
기본 Excutor를 사용하여 전반적인 어플리케이션 레벨에서 비동기처리 가능하다.
자 다음 글에서 구체적인 소스를 보며 적용해 보자!
Reference
'programming language > Java' 카테고리의 다른 글
스프링 부트 swagger 3 적용하기 (0) | 2021.07.09 |
---|---|
spring Async(비동기, 멀티스레드) 메소드 적용하기(2) (0) | 2021.05.20 |
날짜 및 시간 정규식 예제(yyyy-MM-dd hh:mm:ss) (4) | 2021.05.12 |
Spring DTO class의 특정 컬럼이 매핑 되지 않는 문제 (0) | 2021.05.03 |
Junit service(bean) private method test (0) | 2021.04.12 |