공부

Spring Boot 3.1.4 + Redis 간단 연동기

눕고싶은사람 2024. 1. 18. 18:07

생각 나는 대로 적는 정보

Mac OS Ventura 13.4

MacBook Pro M2

Spring Boot 3.1.4

jdk 17

IntelliJ

Docker Desktop


 

* Docker Desktop을 활용하여 로컬 환경에 Redis 설치하기

1. redis를 검색하여 tag를 원하는 버전으로 지정한다.
난 latest를 선택하여 최신 버전으로 진행해보았다.

 

2. 내려 받은 이미지 확인

 

3. 이미지에서 실행 버튼을 클릭한다.

포트 변경을 원하면 포트를 변경해도 상관 없으나 기본 포트로 진행.

Container name 역시 원하는 이름으로 지정하여 진행한다.

 

4. Container 생성 확인

 

5. Container 실행 확인

 

설치한 Redis를 터미널을 통해 확인한다.

명령어 : docker exec -it {Container Name} redis-cli

모든 키를 조회하는 명령어 : keys *

비어있음을 확인.


* Spring Boot 를 통해 Redis 내 데이터 조회 및 추가 해보기

key/value의 형태를 사용하여 데이터를 제어하고자 한다.

따로 repository 생성은 하지 않음.

 

- application.yml

boot 3.0 이상에서는 spring.redis.host가 아닌 spring.data.redis.host 사용

spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379

 

- RedisConfig.java

package io.jh.main.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@EnableCaching
@Configuration
public class RedisConfig {

    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.port}")
    private String port;

	//password는 필요 시 사용
    //@Value("${spring.data.redis.password}")
    //private String password;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(Integer.parseInt(port));
        //redisStandaloneConfiguration.setPassword(password);
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

- RedisController.java

package io.jh.main.controller;

import io.jh.main.model.BasicDataViewVO;
import io.jh.main.service.RedisService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping(path = "/main/v1/redis")
public class RedisController {

    private final RedisService redisService;

    @GetMapping("/get/{key}")
    //테스트용이라 get으로 하였지만 다른걸로 해야한다.
    public ResponseEntity<?> all(@PathVariable String key) {
        String value = redisService.getRedisTemplate(key);
        return new ResponseEntity<>(value, HttpStatus.OK);
    }

    @PostMapping("/add")
    public ResponseEntity<?> addRedis(@RequestBody BasicDataViewVO vo) {
        redisService.addRedisData(vo);
        return new ResponseEntity<>(HttpStatus.CREATED);
    }
}

 

- RedisService.java

package io.jh.main.service;

import io.jh.main.model.BasicDataViewVO;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class RedisService {

    private final RedisTemplate<String, Object> redisTemplate;

    public String getRedisTemplate(String key) {
        ValueOperations<String, Object> template = redisTemplate.opsForValue();
        return (String)template.get(key);
    }

    public void addRedisData(BasicDataViewVO vo) {
        redisTemplate.opsForValue().set(vo.getKey(), vo.getData());
    }
}

 

- BasicDataViewVO.java

왜 이름을 이렇게 했지 싶다.

package io.jh.main.model;

import lombok.Data;

@Data
public class BasicDataViewVO {
    private String key;
    private String data;
}

* Postman 테스트

 

- 데이터 넣기

 

- 데이터 조회


 

간단히 Spring Boot와 Redis를 연동해보았다.