RabbitMQ 사용할 일이 있어서 간단하게 설치부터 사용까지 작성해본 글 입니다.
1. 설치
brew update
brew install rabbitmq
터미널을 열고 위 명령어로 rabbitmq 를 설치할 수 있다.
2. 실행
/usr/local/opt/rabbitmq/sbin/rabbitmq-server
명령어 입력 후 server를 실행시킬 수 있다.
기본 포트는 15672 이다.
서버 실행 후 localhost에 접속하면 위 사진처럼 RabbitMQ 로그인 화면이 나타난다.
초기 Username 및 Password 는 guest/guest 로 접속할 수 있고 후에 설정을 통해 변경할 수 있다.
접속 시 나타나는 화면.
위 화면에서 직접 Exchange / Queue 를 추가할 수 있지만 Spring과 연동해서 Producer, Consumer를 연동해 보겠습니다.
3. Producer 모듈
SpringBoot 2.7.2버전을 사용하였고 Spring에서 RabbitMQ를 사용하기위해 프로젝트 생성 시 RabbitMQ dependency를 찾아 체크해줍니다.
application.properties 작성
포트 및 rabbitmq 접속 정보를 작성합니다.
설정파일 작성 후 실행하면 rabbitmq 가 연결되었다는 문구가 뜹니다.
Config 파일 작성
rabbitmq 빈에 필요한 configuration 파일을 작성합니다.
@Configuration
public class RabbitmqConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.port}")
private int port;
@Bean
Queue queue() {
return new Queue("hello.queue", false);
}
@Bean
DirectExchange directExchange() {
return new DirectExchange("hello.exchange");
}
@Bean
Binding binding(DirectExchange directExchange, Queue queue) {
return BindingBuilder.bind(queue).to(directExchange).with("hello.key");
}
@Bean
RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter);
return rabbitTemplate;
}
@Bean
ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean
MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
}
위 코드에서는 exchange, queue, key를 각각
hello.exchange // hello.queue // hello.key 라고 명칭하였습니다.
Exchange종류에도 여러가지 종류가 있는데 단순 실행 목적이라서 아무렇게나 선택했습니다. (위에서는 DirectExchange)
Service 작성
Producer라는 클래스를 생성한 후 RabbitTemplate 을 사용해 Exchange에 메세지를 보내도록 작성했습니다.
/send라는 api를 생성해서 테스트해보면
rabbitMQ 페이지에 Exchanges 메뉴에 아까 지정했던 exchange가 생성된 걸 볼 수 있고
Overview에 메시지 카운트가 +1 되는걸 확인할 수 있습니다.
Receiver를 통해 생성된 메세지를 Consumer 모듈을 통해 소비합니다.
4. Consumer
@Configuration
public class RabbitmqConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.port}")
private int port;
@Bean
MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(messageConverter());
return factory;
}
@Bean
ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
System.out.println("host: "+host);
return connectionFactory;
}
}
properties 및 configuration 파일 입니다.
Producer와 달리 특별한 설정은 없고 메세지 컨버터만 설정해 주었습니다.
Receiver(Consumer)
Receiver는 아까 생성한 hello.queue에 있는 메세지를 받아 처리하는 서비스입니다.
@RabbitListener 어노테이션을 통해 consumer를 지정할 수 있습니다.
실행 후 로그를 확인해 보면 message 가 정상적으로 소비됨을 볼 수 있습니다.
'Java > Spring' 카테고리의 다른 글
[Spring] JPA 란 무엇인가 (정의, 장단점) (0) | 2023.06.01 |
---|---|
Springboot 환경에서 @Async와 ThreadPoolTaskExecutor (0) | 2023.05.26 |
[Spring] Spring Bean 등록과 의존관계 설정 (0) | 2022.06.20 |
[SpringBoot] Junit 으로 단위테스트 하기 (0) | 2022.06.17 |
[Spring Boot] 2. 스프링 웹 개발 기초 - Static, MVC패턴, API 방식 (0) | 2022.05.30 |