Wookim

spring Async(비동기, 멀티스레드) 메소드 적용하기(1) 본문

programming language/Java

spring Async(비동기, 멀티스레드) 메소드 적용하기(1)

개발자인 경우 2021. 5. 18. 17:27

스프링 비동기 메소드 적용하기

스프링에 비동기 메소드를 적용해보자.

 

적용 이유 

더보기

특정 데이터를 매우 비효율적으로 조회하여 특정 로직을 태워야 하는 상황이다.

 

가능 하다면 다른 방식으로 해결해야 하는 상황이지만, 여건상 성능도 고려하며 빠르게 해결해야 했다.

 

이런 상황에서 해당 메소드를 비동기(멀티스레드) 처리하고 

 

기존에 다른 기능에 문제가 없도록 설정해야 했다.

 


미리 알고 가기

스프링의 @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

https://www.baeldung.com/spring-async

Comments