Redis pub/sub 구현

PUROMANGA·2025년 6월 11일

기술스택

목록 보기
16/22

전체 흐름 구조 요약

RedisSubscriber.sendMessage(...) ← (자동 호출)
        ↑
MessageListenerAdapter ← 이게 Subscriber를 감싼 어댑터
        ↑
RedisMessageListenerContainer ← Redis 구독을 계속 듣고 있는 컨테이너
        ↑
Redis Pub/Sub 채널 ("chatroom")에 메시지 발행됨
        ↑
RedisPublisher.publish(...) 호출

코드

토픽

	@Bean
	public ChannelTopic channelTopic() {
		return new ChannelTopic("chatroom");
	}

chatroom이라는 토픽을 만들어준다.

Redis 서버랑 연결

	@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와 연결을 관리하는 팩토리 객체

나머지는 호스트와 포트 설정, 그 후 객체를 반환

sub 호출

	@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로서 저장해둠.

0개의 댓글