-
[Spring, Spring Boot] 비동기 처리 Asynchronous ProcessingSpring 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를 사용하면 매우 간단하게 비동기 로직을 구현할 수 있습니다. 비동기 처리는 메인 스레드의 부하를 줄이고 애플리케이션의 응답 속도를 높이는 데 큰 도움이 됩니다. 하지만 비동기 작업은 스레드 풀, 예외 처리 등 여러 고려사항이 있으므로 실제 프로덕션 환경에서는 좀 더 주의 깊게 설정하고 관리해야 합니다.
'Spring' 카테고리의 다른 글
[Spring Boot] RESTful API 설계 원칙 (0) 2024.12.02 [Spring, Spring Boot] 비동기 처리 TaskExecutor (0) 2024.11.28 [Spring, Spring Boot] 관점 지향 프로그래밍 AOP (Aspect-Oriented Programming) (0) 2024.11.28 [Spring, Spring Boot] 의존성 주입 (Dependency Injection, DI) (0) 2024.11.28 [Spring, Spring Boot] JAVA ORM (Object Relational Mapping) 객체 관계 매핑 (0) 2024.11.26