Kim-Baek 개발자 이야기

Spring 비동기 Async 본문

카테고리 없음

Spring 비동기 Async

김백개발자 2024. 11. 23. 09:20

Spring의 @Async: 쉽게 이해하기

@Async는 비동기 작업을 간단히 처리하도록 도와주는 Spring의 애노테이션입니다.
비동기란, 어떤 작업을 요청하고 그 작업이 끝날 때까지 기다리지 않고 바로 다음 작업을 진행하는 것을 말합니다.
예를 들어:

  • 동기 작업: 요리를 하면서 밥솥이 밥을 다 지을 때까지 기다리는 것
  • 비동기 작업: 밥솥에 밥을 맡기고, 기다리지 않고 동시에 반찬을 준비하는 것

Spring의 @Async를 사용하면 "밥솥에 밥을 맡기고 바로 반찬 준비" 같은 비동기 작업을 쉽게 구현할 수 있습니다.


@Async를 사용하는 방법

1. 준비 작업: 설정 파일에서 활성화

Spring에서 비동기 기능을 사용하려면 먼저 설정에서 이를 활성화해야 합니다.
설정 클래스에 @EnableAsync를 추가하면 됩니다.

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

@Configuration
@EnableAsync
public class AppConfig {
    // 추가 설정이 필요하다면 여기에 작성
}

2. 비동기로 처리할 메서드에 @Async 추가

@Async를 메서드에 붙이면, 해당 메서드는 새로운 스레드에서 실행됩니다.
이렇게 하면 메서드를 호출한 쪽에서 기다릴 필요 없이 바로 다른 작업을 할 수 있습니다.

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

@Service
public class AsyncService {
    
    @Async
    public void performAsyncTask() {
        System.out.println("비동기 작업 시작!");
        try {
            Thread.sleep(5000); // 5초간 기다리는 작업
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("비동기 작업 완료!");
    }
}

3. 메서드 호출

다른 클래스에서 이 @Async 메서드를 호출하면 호출한 쪽에서는 기다리지 않고 바로 다음 작업을 진행합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class TestController {

    @Autowired
    private AsyncService asyncService;

    public void executeTask() {
        System.out.println("메서드 호출 시작!");
        asyncService.performAsyncTask(); // 비동기 메서드 호출
        System.out.println("메서드 호출 끝!");
    }
}

4. 출력 결과

위 코드를 실행하면 다음과 같이 출력됩니다:

메서드 호출 시작!
메서드 호출 끝!
비동기 작업 시작!
비동기 작업 완료!
  • performAsyncTask()는 비동기로 처리되기 때문에 메서드 호출 끝!이 먼저 출력됩니다.
  • 비동기 작업은 뒤에서 따로 실행됩니다.

주의할 점

  1. @Async는 public 메서드에서만 동작합니다.
    • Spring의 AOP를 사용하기 때문에 private 메서드에서는 동작하지 않습니다.
  2. 메서드 반환값
    • 반환값이 없는 경우에는 void로 설정합니다.
    • 반환값이 있는 경우에는 CompletableFuture 같은 비동기 객체를 사용해야 합니다.
    @Async
    public CompletableFuture<String> performTaskWithResult() {
        return CompletableFuture.completedFuture("작업 완료!");
    }
    
  3. 별도의 스레드 풀 설정 가능
    • 기본적으로 Spring은 SimpleAsyncTaskExecutor를 사용하지만, 성능 최적화를 위해 **스레드 풀(Thread Pool)**을 설정할 수 있습니다.

요약

  • @Async는 간단히 비동기 작업을 처리하도록 도와줍니다.
  • 설정(@EnableAsync)만 추가하면 비동기 메서드를 쉽게 구현할 수 있습니다.
  • 호출한 쪽에서는 기다릴 필요 없이 바로 다음 작업을 진행할 수 있습니다.

비동기 처리가 필요한 곳에서 매우 유용하게 사용할 수 있습니다! 😊

반응형
Comments