1. 비동기 프로그래밍이란?
1) 동기 vs 비동기 처리 방식
백엔드 애플리케이션에서 중요한 개념 중 하나가 동기(Synchronous)와 비동기(Asynchronous) 처리입니다.
- 동기(Synchronous): 요청을 보내면 응답을 받을 때까지 기다리는 방식
- 비동기(Asynchronous): 요청을 보낸 후 응답을 기다리지 않고 다른 작업을 수행하는 방식
2) 웹 애플리케이션에서 비동기 처리가 필요한 이유
비동기 처리는 서버의 성능을 최적화하고 응답 속도를 높이는 데 도움이 됩니다. 예를 들어, 다음과 같은 경우 비동기 처리가 필요합니다:
- 대용량 데이터 처리
- 외부 API 호출
- 파일 업로드 및 다운로드
- 이메일 발송
2. 스프링에서 비동기 처리
Spring Boot에서는 @Async 어노테이션을 사용하여 손쉽게 비동기 처리를 구현할 수 있습니다.
1) @Async를 활용한 비동기 메서드 실행
@Service
public class AsyncService {
@Async
public CompletableFuture<String> asyncMethod() {
try {
Thread.sleep(3000); // 3초 동안 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture("비동기 작업 완료!");
}
}
2) CompletableFuture를 활용한 비동기 결과 반환
@RestController
@RequestMapping("/async")
public class AsyncController {
private final AsyncService asyncService;
@Autowired
public AsyncController(AsyncService asyncService) {
this.asyncService = asyncService;
}
@GetMapping("/run")
public CompletableFuture<String> runAsyncTask() {
return asyncService.asyncMethod();
}
}
이제 /async/run 엔드포인트를 호출하면 즉시 응답을 반환하고, 백그라운드에서 비동기 작업이 실행됩니다.
3. 메시지 큐(Message Queue)란?
1) 메시지 큐의 개념과 필요성
메시지 큐(Message Queue, MQ)는 비동기 처리를 더욱 효율적으로 관리하기 위한 기술로, 프로듀서(Producer) 와 컨슈머(Consumer) 간에 메시지를 전달하는 중간 역할을 수행합니다.
- 비동기 이벤트 처리: 요청을 즉시 처리하지 않고 큐에 저장한 후, 별도의 프로세스가 이를 처리함
- 부하 분산: 다수의 컨슈머를 활용하여 병렬 처리 가능
- 트랜잭션 처리: 메시지를 안전하게 저장하고, 필요할 때 다시 처리할 수 있음
2) 메시지 브로커(Message Broker)란?
메시지 큐를 관리하는 시스템을 메시지 브로커(Message Broker) 라고 하며, 대표적인 메시지 브로커로 다음과 같은 도구가 있습니다:
- RabbitMQ (AMQP 프로토콜 기반)
- Apache Kafka (로그 기반 메시지 처리)
- ActiveMQ
- AWS SQS
4. RabbitMQ 또는 Kafka를 활용한 비동기 처리
1) RabbitMQ 기본 개념
RabbitMQ는 가장 널리 사용되는 메시지 브로커 중 하나로, Exchange 와 Queue 를 통해 메시지를 전달합니다.
RabbitMQ의 주요 구성 요소
- Producer: 메시지를 생성하여 Exchange로 보냄
- Exchange: 메시지를 적절한 큐로 라우팅
- Queue: 메시지가 저장되는 공간
- Consumer: 큐에서 메시지를 읽어 처리
2) Spring Boot에서 RabbitMQ 연동하기
(1) RabbitMQ 설정 추가 (application.yml)
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
(2) 메시지 발행자(Producer) 구현
@Component
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
private static final String EXCHANGE_NAME = "sample.exchange";
public void sendMessage(String message) {
rabbitTemplate.convertAndSend(EXCHANGE_NAME, "routing.key", message);
System.out.println("메시지 전송: " + message);
}
}
(3) 메시지 소비자(Consumer) 구현
@Component
public class MessageConsumer {
@RabbitListener(queues = "sample.queue")
public void receiveMessage(String message) {
System.out.println("메시지 수신: " + message);
}
}
5. 비동기 처리와 메시지 큐의 장단점
✅ 장점
- 성능 향상: 요청을 비동기로 처리하여 응답 속도 향상
- 부하 분산: 여러 개의 컨슈머를 활용하여 작업을 분산 처리 가능
- 트랜잭션 안정성: 메시지를 안전하게 저장하여 장애 발생 시 재처리 가능
❌ 단점
- 설정 및 운영 복잡성: MQ 시스템을 운영하려면 추가적인 인프라 관리 필요
- 메시지 지연 가능성: 큐에 쌓이는 메시지가 많아지면 지연 발생 가능
- 비동기 처리의 어려움: 상태 관리 및 디버깅이 어려울 수 있음
결론
비동기 처리는 백엔드 애플리케이션에서 중요한 개념이며, 특히 RabbitMQ, Kafka와 같은 메시지 큐를 활용하면 더욱 강력한 시스템을 구축할 수 있습니다. 스프링에서 @Async를 활용한 간단한 비동기 처리부터, MQ를 이용한 확장성 높은 시스템까지 익히면 백엔드 개발자로서 더욱 강력한 기술을 갖출 수 있을 것입니다. 🚀
'모각코' 카테고리의 다른 글
[백엔드]JWT 이해하기 (0) | 2025.02.10 |
---|---|
[백엔드]JPA 이해하기 (1) | 2025.02.10 |
[백엔드]RESTful API 이해하기 (0) | 2025.02.10 |
[백엔드]SQL 이해하기 (0) | 2025.01.29 |
[백엔드]자바 스프링부트 이해하기 (0) | 2025.01.29 |