Spring boot @Async 사용법과 주의사항

Dev. 로티·2022년 1월 19일
1

Spring boot

목록 보기
3/12
post-thumbnail

Spring Boot에서는 @Async 어노테이션을 사용해 비동기 처리를 손쉽게 구성할 수 있다.

@Async 어노테이션 사용법과 사용시 몇가지 주의사항이 있는데 모두 알아보도록 하자.

먼저 @Configuration Bean에 @EnableAsync 어노테이션을 추가해야한다.

@EnableAsync
@Configuration
public class AsyncConfig{
	…
	…
}

이제부터 @Async 어노테이션을 메소드 혹은 클래스에 추가함으로써 비동기적으로 메소드를 실행 시킬 수 있다.
(비동기 처리를 진행할 클래스는 반드시 Spring Bean으로 등록되어있어야한다.)

@Async
@Service
public class TestService {
	
	public void …(…){
		…
		…
	}

}

이제 주의사항에 대해 살펴보도록 한다.

private 메소드 호출 및 클래스 내에서 자가 호출할 경우 비동기가 적용이 되지 않는다.

그리고 @Async 어노테이션을 별다른 속성 지정없이 사용한다면 매번 비동기 메소드가 호출될때마다 Thread가 생성되기 때문에 성능에 악영향을 끼칠 수 있다.

그렇기 때문에 ThreadPool을 미리 Bean으로 정의 하고 @Async 어노테이션에 해당 ThreadPool을 사용한다는 설정을 추가하고 사용하는 것이 바람직하다.

또한 만약 JPA를 사용하는 상황이고, 기존 메소드에서 비동기 메소드를 호출하는데 비동기 메소드 내에서 기존 메소드에서 조회한(영속성 컨텍스트에 있는) 엔티티와 연관관계에 묶여있는 다른 엔티티를 LAZY로딩 하는 상황이라면 비동기로 넘어가면서 트랜잭션이 메소드에서 벗어난 상태가 됨으로 LazyInitializationException이 발생한다.

(개인적으로 만약 비동기적인 상황에서도 트랜잭션을 유지해야하는 상황이라면 EAGAR Loding, 혹은 보상 트랜잭션을 고려해야하지 않을까 생각한다.)

0개의 댓글