RedisSubscriber.sendMessage(...) ← (자동 호출)
↑
MessageListenerAdapter ← 이게 Subscriber를 감싼 어댑터
↑
RedisMessageListenerContainer ← Redis 구독을 계속 듣고 있는 컨테이너
↑
Redis Pub/Sub 채널 ("chatroom")에 메시지 발행됨
↑
RedisPublisher.publish(...) 호출
@Bean
public ChannelTopic channelTopic() {
return new ChannelTopic("chatroom");
}
chatroom이라는 토픽을 만들어준다.
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
lettuceConnectionFactory.setHostName(redisProperties.getHost());
lettuceConnectionFactory.setPort(redisProperties.getPort());
return lettuceConnectionFactory;
}
- RedisConnectionFactory 인터페이스의 구현체
RedisConnectionFactory는 Spring Data Redis가 Redis와 통신하기 위해 사용하는 핵심 인터페이스
- LettuceConnectionFactory
Redis 연결을 위한 Lettuce 클라이언트 기반의 ConnectionFactory 객체 생성
Lettuce는 비동기 & 넌블로킹 방식의 Redis 클라이언트로, 스프링에서 많이 사용됨
LettuceConnectionFactory는 Redis와 연결을 관리하는 팩토리 객체
나머지는 호스트와 포트 설정, 그 후 객체를 반환
@Bean
public MessageListenerAdapter listenerAdapterChatMessage(RedisSubscriber subscriber) {
return new MessageListenerAdapter(subscriber, "sendMessage");
}
- MessageListenerAdapter
Redis가 pub으로 사용자에게서 메세지를 받았을 때, 어떤 메서드를 실행할지 연결해주는 어댑터
- subscriber, "sendMessage"
subscriber : 내가 만들어준 클래스 인스턴스
sendMessage : 메서드 이름, 자동으로 실행됨
@Bean
public RedisMessageListenerContainer redisMessageListener(MessageListenerAdapter listenerAdapterChatMessage,
ChannelTopic channelTopic) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory());
container.addMessageListener(listenerAdapterChatMessage, channelTopic);
return container;
}
- RedisMessageListenerContainer container = new RedisMessageListenerContainer();
Redis로부터 메시지를 비동기로 받아들이는 컨테이너 객체 생성
- container.setConnectionFactory(redisConnectionFactory());
Lettuce 기반 Redis 연결 팩토리 주입, 이걸로 Redis 서버와 통신함
- container.addMessageListener(listenerAdapterChatMessage, channelTopic);
여기서 구독한 채널에 메세지가 오면 listenerAdapterChatMessage를 호출하라는 걸 container에 MessageListener로서 저장해둠.