개발환경
OS: Windows 11
IDE: Spring Tool Suite 4.14.1
JAVA: 17
* RabbitMQ와 Redis를 도커로 실행중이라는 전제 하에 진행
(참고: https://velog.io/@armton/series/Docker)
실습 플로우
- 문자열 입력받고
- 큐에 넣을때 (publishing)이라 붙이고
- 빼는 거 성공하면 (subscribe) 붙이기
- 빼낸 거를 이제 레디스에 넣고 (push)라 붙이기
- 빼는 거 성공하면 (get) 붙이기
RedisData.java
package com.apple.api.redis.model;
public class RedisData {
private String key;
private String value;
public RedisData(String key, String value) {
super();
this.key = key;
this.value = value;
}
// lombok으로 대체 가능
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.apple.api.redis.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import com.apple.api.redis.model.RedisData;
@Component
public class RedisUtil {
@Autowired
RedisTemplate<String, String> redisTemplate;
public RedisUtil(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 저장
public boolean setRedisData(RedisData redisData) {
ValueOperations<String, String> vop = redisTemplate.opsForValue();
try {
// Redis 값 세팅. 단, value에 "(push)"라는 텍스트 붙이기
vop.set(redisData.getKey(), redisData.getValue() + "(push)");
return true;
} catch (Exception e) {
return false;
}
}
// 조회
public String getRedisData(String key) {
return redisTemplate.opsForValue().get(key) + "(get)";
}
}
package com.apple.api.rabbitmq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.apple.api.redis.model.RedisData;
import com.apple.api.redis.util.RedisUtil;
@Component
public class Listener {
// 추가
@Autowired
RedisUtil redisUtil;
// Receiver
@RabbitListener(queues = "TestQ") // return 불가. 무조건 void
public void processMessage(String content) {
redisInsert(content); // RabbitMQ에서 받은 값 전달
}
// redis에 저장
public void redisInsert(String content) {
// RedisData 모델에 value로 저장. key는 임의로 "key"라고 지정
RedisData redisData = new RedisData("key", content.concat("(subscribe)"));
redisUtil.setRedisData(redisData);
}
}
package com.apple.api.rabbitmq.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.apple.api.rabbitmq.config.Sender;
import com.apple.api.rabbitmq.listener.Listener;
import com.apple.api.redis.util.RedisUtil;
@RestController
public class MessageController {
@Autowired
Sender sender;
@Autowired
Listener listener;
@Autowired
RedisUtil redisUtil;
@PostMapping("/messages")
public String sendMessage(final @RequestBody Map<String,String> req ) {
String message = req.get("message");
try {
String msg = message + "(publishing)";
sender.send(msg);
Thread.sleep(100); // * Redis에서 바로 get하면 실제로 저장되기 전에 get 되는 이슈가 있어서 임시로 delay 시킴.
return redisUtil.getRedisData("key");
}
catch (Exception e ){
System.out.println(e.getMessage());
return "send message fail";
}
}
}
Springboot 구동(프로젝트 우클릭 > Run As > SpringBoot App)
Postman에서 메시지 보내기
응답 Body 확인