개요
Redis는 인메모리 저장소 Key : Value 형태로 저장되며 캐시 서버로 자주 사용되며 성능 향상, 분산 처리 등 여러 방면에서 도움을 줍니다.
Spring Boot와 Redis를 연결하여 객체를 Redis를 저장하고 조회하는 작업을 정리해보려 합니다.
작업 순서
1. build.gradle 파일에 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
2. application.yml 파일에 Redis 연결 정보 추가
spring:
redis:
host: localhost
port: 6379
3. Redis와 연결할 객체 생성
package com.dotd.product.redis.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.TimeToLive;
import javax.persistence.Id;
@Data
@RedisHash("desk")
@AllArgsConstructor
@NoArgsConstructor
public class Desk {
@Id
private String id;
private String name;
private int cost;
private Long expirationTime;
@TimeToLive
public Long getTimeToLive() {
return expirationTime;
}
}
@RedisHash
@RedisHash 에노테이션은 해당 클래스의 인스턴스가 Redis에 해시 구조로 저장되는 것을 나타냅니다. 이 에노테이션은 주로 Redis에서 영구 저장될 도메인 객체 위에 위치합니다.
@RedisHash(”desk”) 여기서 desk는 해시의 키 접두사로 사용됩니다. @Id 이 에노테이션이 있는 private String id 필드도 마찬가지로 키 접두사로 사용됩니다. 키 접두사는 이 둘을 조합해 사용됩니다. 예를 들어 id가 1이면 desk:1 키로 저장됩니다.
@TimeToLive
@TimeToLive는 Redis에게 해당 객체의 만료 시간을 알려줍니다. 초 단위로 해석되며 3600으로 설정되면 1시간(3600초) 후에 자동으로 삭제됩니다. 시스템에서 임시 데이터를 처리할 때 유용합니다.
4. repository 생성
package com.dotd.product.redis.repository;
import com.dotd.product.redis.entity.Desk;
import org.springframework.data.repository.CrudRepository;
public interface DeskRedisRepository extends CrudRepository<Desk, String> {
}
5. service 생성
package com.dotd.product.redis.service;
import com.dotd.product.redis.entity.Desk;
import com.dotd.product.redis.repository.DeskRedisRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class DeskRedisService {
private final DeskRedisRepository deskRedisRepository;
public void addDesk(Desk desk) {
deskRedisRepository.save(desk);
}
public void getDesk(String id) {
Desk result = deskRedisRepository.findById(id).get();
System.out.println(result);
}
}
6. controller 생성 (선택)
package com.dotd.product.redis.controller;
import com.dotd.product.dto.ProductRegistDto;
import com.dotd.product.dto.ProductResponseDto;
import com.dotd.product.entity.Product;
import com.dotd.product.redis.entity.Desk;
import com.dotd.product.redis.service.DeskRedisService;
import com.dotd.product.redis.service.ProductRedisService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequiredArgsConstructor
@RequestMapping("/redis")
@Slf4j
public class RedisController {
private final DeskRedisService deskRedisService;
@PostMapping("/desk/add")
public ResponseEntity<?> deskAdd(@RequestBody Desk desk) {
deskRedisService.addDesk(desk);
return ResponseEntity.ok("ok");
}
@GetMapping("/desk/get")
public ResponseEntity<?> deskGet(@RequestParam(name = "id") String id) {
Desk desk = deskRedisService.getDesk(id);
return ResponseEntity.ok(desk);
}
}
여기까지 만든 후 애플리케이션을 실행시키고 Postman으로 객체를 Redis에 저장하는 add 메소드 그리고 Redis에서 객체를 조회하는 get 메소드를 실행시켰습니다.
7. 실행 결과
저는 Redis를 편하게 보기 위해서 Redis GUI 즉, 화면을 지원하는 RedisSight를 이용했습니다.
객체가 Hash 형태로 desk:1 처럼 해시이름:아이디 형태로 잘 저장된 것을 확인할 수 있었습니다.
SET 자료형은 왜 저장된거조?
Redis를 보시면 desk라는 이름으로 set 자료형이 저장되어 있는게 보입니다. 이 set은 해당 유형 객체에 대한 모든 키를 저장하고 있습니다. set에 모든 객체의 키 값을 저장하는 이유는 객체 검색, 일괄 작업, 일관성 유지 등을 지원하기 위해 쓰입니다.
마무리
이번에는 Redis와 Spring Boot를 연결하여 객체를 저장하고 조회하는 것을 RedisHash 방법을 이용해서 구현해 보았습니다. RedisHash 방법 외에도 RedisTemplate을 이용하여 Redis와 Spring Boot를 연결할 수도 있습니다.
또한 이렇게 연결된 Redis는 Spring Boot에서 캐시로 활용되어 응답 속도를 올려 성능 향상에 도움이 됩니다.
Redis를 잘 활용하면 프로젝트에 큰 도움이 되는 것을 배운 시간이었습니다.
감사합니다.