BE/Spring & Spring Boot

[Spring Boot] Redis pub/sub

baek-dev 2025. 4. 27. 14:54

Redis Pub/Sub 이란 무엇인가

Redis Pub/Sub(Publish/Subscribe)은 Redis가 제공하는 메시징 기능 중 하나로, 발행/구독 모델을 기반으로 메시지를 전달하는 구조임.
서버 간 또는 서버와 클라이언트 간에 비동기 메시지를 실시간으로 전달할 수 있도록 하는 기능임.

특정 채널(channel)에 메시지를 발행하면, 해당 채널을 구독 중인 모든 클라이언트가 동시에 메시지를 받을 수 있음.
별도의 큐나 브로커 없이 간단하게 실시간 메시징이 가능하다는 점에서 실시간 채팅, 알림, 스트리밍, 이벤트 브로드캐스트 등에 적합함.


1. Redis Pub/Sub 기본 개념

Pub/Sub 구조는 다음과 같이 구성됨:

Publisher → Channel → Subscriber
  • Publisher: 메시지를 발행(publish)하는 주체
  • Channel: 메시지를 전달하는 경로 (주제 또는 토픽 개념)
  • Subscriber: 특정 채널을 구독하여 메시지를 수신하는 대상

2. Redis Pub/Sub 동작 예시

예시: Redis CLI 에서 확인

터미널 A (Subscriber)

redis-cli
> SUBSCRIBE news

터미널 B (Publisher)

redis-cli
> PUBLISH news "Redis Pub/Sub 메시지 테스트"

결과 (터미널 A에서 확인됨)

1) "message"
2) "news"
3) "Redis Pub/Sub 메시지 테스트"

3. Redis Pub/Sub vs 일반 메시지 큐

항목 Redis Pub/Sub 일반 메시지 큐 (예: Kafka, RabbitMQ)
메시지 저장 저장하지 않음 (비영속) 저장함 (영속)
메시지 수신 실시간으로 구독 중일 때만 수신 가능 수신 시점과 무관하게 보장됨
복구 가능성 불가능 가능 (ack, retry 등)
구조 간단하고 가볍고 빠름 복잡하지만 신뢰성 높음
사용 사례 실시간 채팅, 알림, 게임 등 트랜잭션 처리, 로그, 이벤트 저장

4. Spring Boot에서 Redis Pub/Sub 사용하기

1) 의존성 추가 (Gradle)

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

2) Redis 설정

@Configuration
public class RedisConfig {
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                   MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
        return container;
    }

    @Bean
    public MessageListenerAdapter listenerAdapter(RedisSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }
}

3) Subscriber 구현

@Component
public class RedisSubscriber {
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(pattern);
        String body = new String(message.getBody());
        System.out.println("채널: " + channel + ", 메시지: " + body);
    }
}

4) Publisher 구현

@Service
public class RedisPublisher {
    private final RedisTemplate<String, Object> redisTemplate;

    public RedisPublisher(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void publish(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }
}

5. 실무 활용 사례

  • 실시간 채팅 시스템
    • 채팅방별 채널을 구성하여 사용자 간 메시지 실시간 송수신 처리
  • 멀티 서버 알림 브로드캐스트
    • 여러 대의 서버에서 하나의 이벤트를 동시에 전파해야 할 때 유용함
  • 게임 서버 이벤트 전파
    • 게임 내 이벤트, 상태 변경을 다른 클라이언트에 즉시 전달함
  • 실시간 주식 시세/데이터 피드
    • 외부 시스템에서 받은 데이터를 여러 구독자에게 실시간으로 전달함

6. Redis Pub/Sub 한계 및 주의사항

항목 설명
메시지 유실 가능성 구독자가 연결되지 않은 상태에서는 메시지를 수신하지 못함
순서 보장 없음 메시지 순서가 엄격히 보장되지 않음
신뢰성 낮음 ACK, 재전송 기능이 없음
스케일 확장 구독자 수가 많아지면 부하 분산 고려 필요함

→ 신뢰성 있는 메시징이 필요할 경우 Redis 대신 Kafka, RabbitMQ 등을 사용하는 것이 적합함.


정리

Redis Pub/Sub은 간단하고 빠른 실시간 메시징이 필요할 때 적합한 기능임.
채널을 기반으로 메시지를 실시간으로 발행하고, 구독자가 이를 수신함.
구조가 단순하고 구현이 쉬우며 Spring Boot에서도 손쉽게 사용할 수 있음.

단, 메시지 영속성이나 복구 기능이 없기 때문에 정확한 메시지 전달 보장이 필요한 시스템에는 부적합함.
가볍고 빠른 실시간 처리에 적합하므로 채팅, 알림, 게임 이벤트 등 즉시성이 중요한 곳에 많이 활용됨.

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] 퍼사드 패턴  (0) 2025.05.02
[Spring Boot] E2E 테스트  (0) 2025.04.29
[Spring Boot] STOMP  (1) 2025.04.26
모놀리식 아키텍처와 MSA  (0) 2025.04.24
[Spring Boot] Spring JDBC  (0) 2025.04.22