스프링부트 Redis 연습 1 - get/set 구현

스프링부트에서 Redis를 연동하는 연습용 프로젝트를 만들어 보겠습니다!

Redis 기본 이론

깃헙에 있는 정리본을 참고해주세요!

https://github.com/namusik/TIL-SampleProject/tree/main/Redis

Redis window 설치 및 실행

https://oingdaddy.tistory.com/225

Redis 서버를 킨 상태에서 코드를 작성해봅시다!

소스코드

https://github.com/namusik/TIL-SampleProject/tree/main/Redis/Redis%20get-set%20%EC%98%88%EC%A0%9C

작업환경

IntelliJ
Spring-boot
java 11
gradle

dependency

Lombok
spring web
spring data redis

application.yml

spring:
  redis:
    host: localhost
    port: 6379
    

autoConfiguration 덕분에 서버주소:포트번호만 적어줘도 StringRedisTemplate과 redisConnectionFactory는 자동 생성된다

ChatMessage Model

@Getter
@NoArgsConstructor
@AllArgsConstructor

public class ChatMessage {
    private String sender;
    private String context;
}

메세지 모델 클래스
보내는사람과 내용을 필드로 가지고 있음.

RedisConfig

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

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

Json 형식으로 객체를 Value에 저장시키기 때문에 valueSerializer를 Jackson으로 미리 설정해놓은 RedisTemplate을 만들어 준다.

StringRedisTemplate은 따로 Bean으로 안만들어도 쓸 수 있음.

RedisService

	@Service
    @RequiredArgsConstructor
    public class RedisService {

        private final StringRedisTemplate stringRedisTemplate;

        public void setRedisStringValue(ChatMessage chatMessage) {
            ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
            stringValueOperations.set("sender", chatMessage.getSender());
            stringValueOperations.set("context", chatMessage.getContext());
        }

        public void getRedisStringValue(String key) {

            ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
            System.out.println(key +" : " + stringValueOperations.get(key));
        }
    }
    
        public void setRedisValue(ChatMessage chatMessage) {
        ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
        String key = chatMessage.getSender();
        valueOperations.set(key, chatMessage);
    }

        public void getRedisValue(String key) {
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            ChatMessage chatMessage = (ChatMessage) valueOperations.get(key);
            System.out.println("sender = " + chatMessage.getSender());
            System.out.println("context = " + chatMessage.getContext());
        }

Redis 서비스클래스

RedisTemplate<String, Object>는 get/set을 위한 객체.

template에서 valueOperation객체를 받아 사용함.

스프링부트에서는 아래의 redisTemplate이 자동생성되는데,

@Autowired RedisTemplate redisTemplate; 
@Autowired StringRedisTemplate stringRedisTemplate; 
@Autowired ReactiveRedisTemplate reactiveRedisTemplate; 
@Autowired ReactiveStringRedisTemplate reactiveStringRedisTemplate;

redisTemplate 과 stringRedsiTemplate는 직렬화에 차이가 있음

stringRedisTemplate은 문자열에 특화된 template제공. 대부분 레디스 key-value는 문자열 위주기 때문에.

redisTemplate은 자바 객체를 redis에 저장하려고 할 때 사용하면 됨.

setRedisStringValue(ChatMessage chatMessage)를 통해 전달받은 메시지객체를 각각 redis에 set해줌.

getRedisStringValue(Strin key)통해 제대로 저장이 되었는지 출력해봄.

setRedisValue(ChatMessage chatmessage) 는 redisTemplate을 사용해서 value에 자바 객체 자체를 저장시킴

RedisController

@RestController
@RequiredArgsConstructor
public class RedisController {

    public final RedisService redisService;

    @PostMapping("api/redisStringTest")
    public String send(@RequestBody ChatMessage chatMessage) {
        redisService.setRedisStringValue(chatMessage);

        redisService.getRedisStringValue("sender");
        redisService.getRedisStringValue("context");

        return "success";
    }
    
    @PostMapping("api/redisTest")
    public String send(@RequestBody ChatMessage chatMessage) {
        redisService.setRedisValue(chatMessage);

        String key = chatMessage.getSender();
        redisService.getRedisValue(key);

        return "success";
    }
}

RedisService를 생성자 의존성주입으로 가져와서 JSON형태로 객체를 전달받으면 set/get을 한번에 실행시켜서 최종적으로 출력시켜보는 Controller.

두 방식 모두 같은 결과로 나옴

실행결과

Postman을 사용해서 api를 실행시키면

성공시 "success"를 반환하고

저장해준 ChatMessage의 sender와 context가 제대로 출력되면 성공

참고

https://victorydntmd.tistory.com/348
https://oingdaddy.tistory.com/308
https://jeong-pro.tistory.com/175
https://bcp0109.tistory.com/328

좋은 웹페이지 즐겨찾기