10/24

2025. 10. 24. 23:45·TIL

Redis Pub/Sub

Redis Pub/Sub 구조는 실시간 알림 시스템, 채팅, 비동기 이벤트 처리 등에 널리 쓰이는 핵심 기술이다.
이번 글에서는 Pub/Sub의 개념부터 Redis를 활용한 실제 예시까지 정리해봤다.


1. Pub/Sub이란? (Publish / Subscribe의 개념)

Pub/Sub(Publish/Subscribe)은 ‘발행/구독’ 모델로 불리는 비동기 메시지 전달 구조다.

일반적인 요청-응답 구조와 달리, 이벤트를 발행(Publish)하면 구독(Subscribe) 중인 모든 서비스나 모듈이 실시간으로 메시지를 전달받는 구조를 가진다.

즉, 발행자는 수신자가 누구인지 몰라도 메시지를 보낼 수 있고, 수신자는 발행자의 상태에 상관없이 메시지를 받을 수 있다.


2. Redis Pub/Sub의 구조와 동작 원리

Redis는 메모리 기반의 초고속 데이터베이스로, 이 Pub/Sub 구조를 매우 효율적으로 제공한다.

주요 구성요소

항목 역할 예시
Publisher (발행자) 메시지를 보내는 주체 댓글 등록 시 “새 댓글 알림” 발행
Channel (채널) 메시지 통로 예: comment.new, notification.event
Subscriber (구독자) 메시지를 받는 주체 알림 서비스, 웹소켓 서버 등

동작 순서 예시

  1. 사용자가 댓글을 작성한다.
  2. 서버가 Redis의 comment.new 채널에 메시지를 발행한다.
  3. 해당 채널을 구독 중인 알림 서버가 메시지를 수신한다.
  4. 알림 서버는 사용자에게 실시간 알림을 전송한다.

이 과정은 완전히 비동기적으로 이루어진다.
따라서 본 서비스의 성능에 거의 영향을 주지 않으면서도 실시간 반응형 시스템을 만들 수 있다.


3. Redis Pub/Sub vs 메시지 큐 (Kafka, RabbitMQ)

Redis Pub/Sub과 Kafka, RabbitMQ 같은 메시지 큐(Message Queue) 시스템은 종종 혼동된다.
둘은 유사하지만 목적과 특징이 다르다.

구분 Redis Pub/Sub 메시지 큐
전달 방식 실시간 브로드캐스트 큐에 저장 후 순차 처리
메시지 보관 여부 저장되지 않음 (유실 가능) 저장 및 재처리 가능
목적 빠른 실시간 알림 안정적 비동기 처리
예시 사용처 실시간 채팅, 알림, 로그 스트림 주문 처리, 트랜잭션 이벤트

정리하자면, Redis Pub/Sub은 ‘지금 바로 전달해야 하는 실시간 이벤트’에, 메시지 큐는 ‘유실 없이 확실히 처리해야 하는 이벤트’에 적합하다.


4. Spring Boot에서 Redis Pub/Sub 구현 예시

Spring Boot 환경에서 Redis Pub/Sub을 구현할 때는 RedisTemplate을 사용해 쉽게 발행(Publish)할 수 있다.

1) Publisher – 메시지 발행자

Publisher는 Redis 서버에 메시지를 “보내는” 역할을 한다.
RedisTemplate을 사용하면 손쉽게 구현할 수 있다.

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

    public void publish(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }
}
여기서 `convertAndSend()`는 Redis의 특정 채널로 메시지를 보내는 역할을 한다.

예를 들어 channel이 "comment.new"라면, "새 댓글이 등록되었습니다" 같은 메시지를 해당 채널로 보낼 수 있다.

즉, 이 클래스는 이벤트를 감지하거나 특정 동작이 일어났을 때 그 사실을 Redis에게 알려주는 “방송 송신기” 역할을 한다고 보면 된다.

2) Subscriber – 메시지 수신자

Subscriber는 Redis에서 발행된 메시지를 “듣는” 역할을 한다.
아래 예시는 MessageListener 인터페이스를 구현한 간단한 형태다. 

@Component
public class RedisSubscriber implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("새 메시지 수신: " + message.toString());
    }
}

`onMessage()` 메서드는 Redis에서 메시지가 도착할 때마다 자동으로 실행된다.
즉, Publisher가 `convertAndSend()`로 보낸 메시지를 이곳에서 실시간으로 받을 수 있다.

이 구조를 이해하면 다음과 같은 흐름으로 정리할 수 있다.

클라이언트 → 서버(댓글 작성) → Redis(메시지 발행) → 구독 중인 서버(알림 서비스) → 사용자(실시간 알림 전송)

결국 Redis는 “중간 방송국” 역할을 하는 셈이다.


5. Redis Pub/Sub의 활용 사례

Redis Pub/Sub은 다양한 실무 서비스에서 쓰인다.

  • 실시간 알림 시스템 – 댓글, 좋아요, 팔로우 알림
  • 채팅 서비스 – 채널별 메시지 실시간 전달
  • 모니터링 시스템 – 서버 로그, 이벤트 스트림 전송
  • 게임 / 스포츠 서비스 – 경기 스코어 실시간 반영
  • 웹소켓(WebSocket) – 실시간 UI 업데이트와 결합 가능

특히 웹소켓과 함께 사용하면 Redis → 서버 → 클라이언트(브라우저)로 이어지는 완벽한 실시간 통신 구조를 구현할 수 있다.


6. Redis Pub/Sub의 장점과 주의점

Redis Pub/Sub의 가장 큰 장점은 단순성과 속도다.
Redis는 메모리 기반이기 때문에 메시지가 거의 지연 없이 전달된다.
설정이 간단하고 코드가 단순해 빠르게 실무에 적용할 수 있다는 것도 큰 장점이다.
또한 여러 서버가 동시에 같은 Redis를 구독하면, 서버 간 이벤트를 실시간으로 공유하는 구조도 쉽게 만들 수 있다.

하지만 주의할 점도 있다.
가장 큰 한계는 메시지가 저장되지 않는다는 것이다.
즉, 구독자가 연결되지 않은 순간에 발행된 메시지는 사라진다.
Redis를 재시작하면 이전 메시지 기록도 남지 않는다.
따라서 “실시간성”이 중요할 때는 좋지만, 유실 없이 반드시 전달되어야 하는 메시지에는 Kafka 같은 솔루션이 더 적합하다.


7. 마치며

Redis Pub/Sub은 단순한 구조지만 실시간 시스템의 핵심 기초 기술이라는 점을 알게 되었다.

이벤트를 굳이 동기적으로 처리하지 않아도 된다는 점, 즉 빠르게 반응하고, 나중에 처리한다는 개념이 현대 웹 아키텍처에서 얼마나 중요한지 다시 느꼈다.

특히 알림, 채팅, 실시간 대시보드처럼 즉각적인 피드백이 중요한 서비스라면 Redis Pub/Sub은 꼭 한 번 실습해볼 가치가 있는 기술이다.

'TIL' 카테고리의 다른 글

Spring Boot 성능 최적화 2  (0) 2025.10.27
Spring Boot 성능 최적화 1  (0) 2025.10.25
10/23  (1) 2025.10.23
10/20  (0) 2025.10.20
10/19  (0) 2025.10.19
'TIL' 카테고리의 다른 글
  • Spring Boot 성능 최적화 2
  • Spring Boot 성능 최적화 1
  • 10/23
  • 10/20
twodc
twodc
매일의 배움과 고민, 그리고 작은 성장을 담은 개발자의 성장일지입니다.
  • twodc
    The Answer is 42
    twodc
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • TIL (122)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
twodc
10/24
상단으로

티스토리툴바