ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring, Spring Boot] 비동기 처리 Asynchronous Processing
    Spring 2024. 11. 28. 14:33

    비동기 프로그래밍멀티스레드 환경에서 비즈니스 로직의 병목을 줄이고, 시스템의 성능을 향상시키기 위해 자주 사용됩니다. Spring Boot는 비동기 처리를 쉽게 지원하기 위해 @Async 어노테이션을 제공합니다.

     

    비동기 처리는 특정 작업을 메인 스레드와 분리하여 별도의 스레드에서 실행하는 방식입니다. 예를 들어, 데이터를 저장하거나 외부 API를 호출하는 시간이 오래 걸리는 경우, 이 작업을 메인 스레드에서 처리하면 애플리케이션의 응답 시간이 길어질 수 있습니다. 비동기 처리를 사용하면 이러한 무거운 작업을 별도 스레드로 처리하여 응답성을 향상시킬 수 있습니다.

     

    1. 설정 추가하기

    먼저, 비동기 처리를 활성화하기 위해 Spring Boot 애플리케이션 클래스에 @EnableAsync 어노테이션을 추가해야 합니다.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableAsync;
    
    @SpringBootApplication
    @EnableAsync
    public class AsyncApplication {
        public static void main(String[] args) {
            SpringApplication.run(AsyncApplication.class, args);
        }
    }
    
    // @EnableAsync는 비동기 기능을 활성화하는 역할을 합니다.

     

    2. @Async 어노테이션 사용하기

    비동기로 처리하고 싶은 메서드에 @Async 어노테이션을 추가합니다. 예를 들어, 간단한 이메일 발송 서비스를 비동기적으로 처리해보겠습니다.

    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    
    @Service
    public class EmailService {
    
        @Async
        public void sendEmail(String email) {
            System.out.println("이메일 발송 시작: " + email);
            try {
                Thread.sleep(5000); // 이메일 발송에 5초 걸린다고 가정
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("이메일 발송 완료: " + email);
        }
    }
    
    // 위 코드에서 sendEmail() 메서드에 @Async 어노테이션을 붙였습니다. 
    // 이 메서드는 5초 동안 대기 후 이메일을 발송하는 동작을 시뮬레이션합니다.

     

    3. 서비스 호출하기

    이제 컨트롤러에서 EmailService를 사용하여 비동기적으로 이메일을 발송해보겠습니다.

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class EmailController {
    
        @Autowired
        private EmailService emailService;
    
        @GetMapping("/send-email")
        public String sendEmail(@RequestParam String email) {
            emailService.sendEmail(email);
            return "이메일 발송 요청 완료!";
        }
    }
    
    // 이제 /send-email?email=test@example.com API를 호출하면, 
    // 메인 스레드는 이메일 발송과 관계없이 곧바로 "이메일 발송 요청 완료!"라는 응답을 반환합니다.

     

    4. 코드 실행 결과

    API를 호출했을 때의 콘솔 로그를 보면 다음과 같은 결과가 나타납니다.

    이메일 발송 시작: test@example.com
    이메일 발송 완료: test@example.com

     

    메인 스레드는 "이메일 발송 요청 완료!"를 즉시 반환하며, 별도 스레드에서 이메일 발송 작업을 진행하는 것을 볼 수 있습니다.

     

    결론

    Spring Boot에서 비동기 처리를 위해 @Async@EnableAsync를 사용하면 매우 간단하게 비동기 로직을 구현할 수 있습니다. 비동기 처리는 메인 스레드의 부하를 줄이고 애플리케이션의 응답 속도를 높이는 데 큰 도움이 됩니다. 하지만 비동기 작업은 스레드 풀, 예외 처리 등 여러 고려사항이 있으므로 실제 프로덕션 환경에서는 좀 더 주의 깊게 설정하고 관리해야 합니다.

     

    댓글

Designed by Tistory.