@Async

코딩냥이·2024년 9월 10일

Annotation

목록 보기
32/34

@Async

@Async 어노테이션은 스프링 프레임워크에서 메소드를 비동기적으로 실행할 수 있게 해주는 어노테이션입니다.

기능

  1. 메소드를 비동기적으로 실행하도록 표시합니다.
  2. 별도의 스레드에서 메소드를 실행하여 호출자의 실행을 차단하지 않습니다.
  3. 장시간 실행되는 작업이나 외부 시스템과의 통신 등에 유용합니다.

사용 방법

기본적인 사용 방법은 다음과 같습니다:

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class EmailService {

    @Async
    public void sendEmail(String to, String subject, String content) {
        // 이메일 전송 로직 (시간이 걸리는 작업)
        System.out.println("Sending email to " + to);
        // ... 이메일 전송 코드 ...
    }
}

주요 특징

  1. 비차단 실행: 메소드 호출이 즉시 반환되고, 실제 작업은 별도의 스레드에서 실행됩니다.
  2. 반환 값 처리: Future 또는 CompletableFuture를 사용하여 비동기 작업의 결과를 처리할 수 있습니다.
  3. 예외 처리: 비동기 메소드에서 발생한 예외는 별도로 처리해야 합니다.
  4. 트랜잭션: 비동기 메소드는 호출자의 트랜잭션 컨텍스트를 공유하지 않습니다.

설정

@Async를 사용하려면 다음과 같이 설정해야 합니다:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
    // 추가 설정이 필요한 경우 여기에 작성
}

고급 사용법

1. 커스텀 Executor 사용

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.initialize();
        return executor;
    }
}

2. Future를 이용한 결과 처리

@Async
public Future<String> asyncMethodWithReturnType() {
    // 시간이 걸리는 작업 수행
    return new AsyncResult<>("작업 완료");
}

3. CompletableFuture 사용

@Async
public CompletableFuture<String> asyncMethodWithCompletableFuture() {
    // 시간이 걸리는 작업 수행
    return CompletableFuture.completedFuture("작업 완료");
}

4. 예외 처리

@Async
public void asyncMethodWithExceptionHandler() {
    try {
        // 비동기 작업 수행
    } catch (Exception e) {
        // 예외 처리 로직
    }
}

주의사항

  1. 셀프 호출: 같은 클래스 내에서 @Async 메소드를 호출하면 비동기로 동작하지 않습니다.
  2. public 메소드: @Async는 public 메소드에만 적용됩니다.
  3. 트랜잭션: 비동기 메소드는 호출자의 트랜잭션 범위 밖에서 실행됩니다.
  4. 테스트: 비동기 메소드 테스트 시 특별한 고려가 필요합니다.

베스트 프랙티스

  1. 적절한 사용: 장시간 실행되는 작업이나 I/O 바운드 작업에 사용하세요.
  2. 예외 처리: 비동기 메소드 내에서 예외를 적절히 처리하세요.
  3. 리소스 관리: 스레드 풀 크기를 적절히 설정하여 리소스를 효율적으로 관리하세요.
  4. 모니터링: 비동기 작업의 실행 상태와 성능을 모니터링하세요.
  5. 테스트: 비동기 동작을 고려한 테스트 케이스를 작성하세요.

테스트

@Async 메소드를 테스트할 때:

@SpringBootTest
class EmailServiceTest {

    @Autowired
    private EmailService emailService;

    @Test
    void testAsyncMethod() throws InterruptedException {
        emailService.sendEmail("test@example.com", "Test", "Content");
        
        // 비동기 작업이 완료될 때까지 대기
        Thread.sleep(1000);
        
        // 여기서 작업 결과를 확인하거나 모의 객체를 통해 호출 여부를 검증
    }
}

결론

@Async 어노테이션은 스프링 애플리케이션에서 비동기 처리를 간단하게 구현할 수 있게 해주는 강력한 도구입니다. 이를 통해 장시간 실행되는 작업이나 외부 서비스 호출 등을 효율적으로 처리할 수 있으며, 애플리케이션의 응답성과 확장성을 향상시킬 수 있습니다. 그러나 비동기 프로그래밍의 복잡성, 리소스 관리, 예외 처리 등의 측면을 신중히 고려해야 합니다. 적절히 사용하면 애플리케이션의 성능을 크게 개선할 수 있지만, 무분별한 사용은 오히려 시스템의 복잡성을 증가시키고 디버깅을 어렵게 만들 수 있습니다.

연관 포스팅

@EnableAsync
@Scheduled
@Configuration
@Service
@SpringBootTest

profile
HelloMeow~!

0개의 댓글