# [spring.io] 레디스로 메시지 통신하기(코틀린 ver.)
#kotlin #spring
레디스 서버 실행하기
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' 카테고리의 다른 글
[spring.io] 스프링 JDBC를 활용하여 관계형 데이터베이스 연동하기(코틀린 ver.) (0) | 2020.10.18 |
---|---|
[spring.io]RESTful 웹 서비스 호출하기(코틀린 ver.) (0) | 2020.10.17 |
[spring.io]RESTful 웹 서비스 만들기(코틀린 ver.) (0) | 2020.10.17 |
스프링 부트에서 도커 컨테이너 이미지 생성하기 (0) | 2020.07.08 |
[React+Spring] 리액트, 스프링 부트로 웹소켓 구현하기 (3) | 2020.04.09 |