web/SpringBoot
SpringBoot 에 Redis 연동하기
뽀리님
2023. 11. 27. 17:56
설치는 아랫글 참조
https://ssmyefrin.tistory.com/47
간단하게 SpringBoot 와 연동해보려고 한다.
✔ 실행환경
-IntelliJ + SpringBoot 3.1.5 + JDK17
-MAC OS(intel)
-Redis (Medis)
간단히 조회성만 할것이기에 StandardAlone 으로 구성하였다.
필요하다면 Cluster 구성을 해야한다.(주로 클러스터로 구성하는편이다. 하지만 나는 테스트기에..)
1. 의존성추가 : Lettuce Redis Cluster 적용
// Redis lettuce
implementation group: 'io.lettuce', name: 'lettuce-core', version: '6.1.8.RELEASE'
redis의 클러스터를 이용해 데이터들을 샤딩 할수 있다. 스프링 부트에서 기본 레디스 라이브러리는 lettuce 이다.
2. 설정 Config 추가
@Slf4j
public class KakaoRedis implements AutoCloseable {
private RedisURI redisURI;
private RedisClient redisClient;
private RedisClusterClient redisCluster;
private StatefulRedisConnection<String, String> connection;
private StatefulRedisClusterConnection<String, String> connection_;
public KakaoRedis(String redisUrl){
this.redisURI = RedisURI.Builder.redis(redisUrl).build();
}
public KakaoRedis(String redisUrl, int port){
this.redisURI = RedisURI.Builder.redis(redisUrl, port).build();
}
/**
* 클러스터용
* @return
*/
public RedisAdvancedClusterCommands<String, String> getClusterRedisCommands(){
this.redisCluster = RedisClusterClient.create(Arrays.asList(this.redisURI)); // 인스턴스생성
this.connection_ = redisCluster.connect(); // 접속
// failover set
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.enablePeriodicRefresh(Duration.ofSeconds(60))
.enableAllAdaptiveRefreshTriggers()
.build();
redisCluster.setOptions(ClusterClientOptions.builder()
.topologyRefreshOptions(topologyRefreshOptions)
//.autoReconnect(false)
.build());
RedisAdvancedClusterCommands<String, String> syncCommands = connection_.sync(); // 명령 인스턴스
return syncCommands;
}
/**
* 싱글노드용
* @return
*/
public RedisCommands<String, String> getRedisCommands(){
this.redisClient = RedisClient.create(this.redisURI);
this.connection = redisClient.connect();
RedisCommands<String, String> syncCommands = connection.sync();
return syncCommands;
}
@Override
public void close() throws Exception {
if (connection != null && connection.isOpen()) {
connection.close();
redisClient.shutdown();
}
if (connection_ != null && connection_.isOpen()) {
connection_.close();
redisCluster.shutdown();
}
}
}
나는 클러스터와 싱글노드 모두 구현하였다.
자동으로 클로징해주기위헤 AutoClose 를 임플리먼트하고 오버라이드로 정의해줬다.
3. 서비스등록
@Service
@RequiredArgsConstructor
@Slf4j
public class RedisService {
@Value("${address.redis}")
private String redisUrl;
@Value("${address.port}")
private int redisPort;
/**
* 코드등록
* @param code
* @param value
*/
public void redisRegistCode(String code, String value){
try (KakaoRedis kakaoRedisConfig = new KakaoRedis(redisUrl,redisPort)) {
RedisCommands<String, String> syncCommands = kakaoRedisConfig.getRedisCommands();
syncCommands.set(code, value);
} catch (Exception e){
log.error("[Redis Regist EXCEPTION]:"+e.getMessage(),e);
}
}
/**
* 코드조회
* @param code
* @return
*/
public String redisGetCode(String code){
String value = "";
try (KakaoRedis kakaoRedisConfig = new KakaoRedis(redisUrl,redisPort)) {
value = kakaoRedisConfig.getRedisCommands().get(code);
} catch (Exception e){
log.error("[Redis Regist EXCEPTION]:"+e.getMessage(),e);
}
return value;
}
}
간단하게 컨트롤러에서 코드값과 밸류값을 받은 후 조회하는 코드이다.
4. 컨트롤러등록
@RequestMapping("common")
public class TodoController {
private final RedisService redisService;
@GetMapping("/hello")
public String hello() {
return "Hello backend service";
}
@PostMapping("/code/regist")
public ResponseEntity<?> codeRegist(@RequestParam String code, @RequestParam String value) {
redisService.redisRegistCode(code,value);
return ResponseEntity.ok().body("success");
}
@GetMapping("/code/search")
public ResponseEntity<?> codeRegist(@RequestParam String code) {
String val = redisService.redisGetCode(code);
return ResponseEntity.ok().body(val);
}
}
5. 테스트
끝