# [spring.io] 레디스로 메시지 통신하기(코틀린 ver.)

#kotlin #spring

참고 사이트 : Getting Started | Messaging with Redis

레디스 서버 실행하기

spring.io 예제에서는 brew 를 사용하여 reds 서버를 설치하고 실행합니다.
이번 예제에서는 docker 를 사용하여 redis 를 실행합니다.
참고 사이트 : https://hub.docker.com/_/redis/

실행 명령어 : docker run —name some-redis -p 6379:6379 -d redis

Spring Initializr 로 시작하기

메이븐 기준으로 다음 의존성을 추가한 프로젝트를 생성합니다.

  • Spring Data Redis (Access+Driver)
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

Receiver 클래스 생성하기

메시지를 받고 응답하는 Receiver 클래스를 생성합니다.
Receiver는 POJO로 메시지를 수신하는 메소드를 정의합니다.
예제에서는 메시지를 전달 받으면 receiveMessage 함수를 호출할 예정입니다.

class Receiver {
    val LOGGER = LoggerFactory.getLogger(Receiver::class.java)
    val counter = AtomicInteger()

    fun receiveMessage( message: String ) {
        LOGGER.info(“Received < $message >”);
        counter.incrementAndGet();
    }
}

리스너를 등록하고 메시지를 보내기

스프링 데이터 레디스는 레디스와 메시지를 주고받기 위한 모든 컴포넌트를 제공합니다.
- 커넥션 팩토리
- 메시지 리스너 컨테이너
- 레디스 템플릿
예제에서는 레디스 템플릿을 사용하여 메시지를 보내고 Receiver 메시지 리스너로 등록합니다.

@SpringBootApplication
class RedisApplication{

    val LOGGER = LoggerFactory.getLogger(RedisApplication::class.java)

    @Bean
    fun container(
            connectionFactory: RedisConnectionFactory,
            listernerAdapter: MessageListenerAdapter) : RedisMessageListenerContainer {

        val container = RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory)
        container.addMessageListener(listernerAdapter, PatternTopic(“chat”))

        return container
    }

    @Bean
    fun listenerAdapter(receiver: Receiver) : MessageListenerAdapter {
        return MessageListenerAdapter(receiver, “receiveMessage”)
    }

    @Bean
    fun receiver() : Receiver {
        return Receiver()
    }

    @Bean
    fun template(connectionFactory: RedisConnectionFactory) : StringRedisTemplate {
        return StringRedisTemplate(connectionFactory)
    }

}

fun main(args: Array<String>) {

    val ctx = runApplication<RedisApplication>(*args)
    val template : StringRedisTemplate = ctx.getBean(StringRedisTemplate::class.java)

    val receiver : Receiver = ctx.getBean(Receiver::class.java)

    while(receiver.counter.toInt() == 0) {
        *println*(“Sending message…”);
        template.convertAndSend(“chat”, “Hello from Redis!”);
        Thread.sleep(500L);
    }
}

실행 결과

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.4.RELEASE)

INFO 61756 --- [           main] com.example.redis.RedisApplicationKt     : Starting RedisApplicationKt on C02XHD9VJG5J with PID 61756 (/Users/user/study/redis/target/classes started by in /Users/user/study/redis)
INFO 61756 --- [           main] com.example.redis.RedisApplicationKt     : No active profile set, falling back to default profiles: default
INFO 61756 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
INFO 61756 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
INFO 61756 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces.
INFO 61756 --- [           main] com.example.redis.RedisApplicationKt     : Started RedisApplicationKt in 1.298 seconds (JVM running for 1.737)
Sending message...
2020-10-19 20:18:43.770  INFO 61756 --- [    container-2] com.example.redis.Receiver               : Received < Hello from Redis! >

Process finished with exit code 0

다른 카테고리의 글 목록

Spring 카테고리의 포스트를 톺아봅니다