-
레디스(Redis)? 함 써봅시다. Spring Boot + Redis 연동하기!스터디 노트 2023. 12. 21. 15:38
Redis..많이 들어보셨을거라 생각합니다.
인메모리 DB 중 가장 많이 쓰이며, 흔히 캐시 메모리로 많이 사용되고 있지요.
근데 정작 써볼려고하니, 뭘 어떻게 써야하나..살짝 막막하기도 했습니다.
일단 뭐 애매한건 만들면서 깨버려야겠지요.
만들어 봅시다.
Java 17에 Spring Boot 3.2.x, 그리고 Redis를 준비합니다.
우선 Redis는 도커로 띄워보죠.
> docker pull redis ...다운로드 완료... > docker run --name redis -p 6379:6379 -d redis 도커에서 redis라는 이름의 컨테이너로 6379 포트에 매핑하여 서비스를 실행시킵니다. > docker exec -it redis redis-cli redis 컨테이너에 redis-cli로 접속합니다. redis 컨테이너에 접속하면 아래처럼 뜹니다. 127.0.0.1:6379> ...
Redis 준비 끝! 아주 간단하지요?
그럼 이제 스프링 부트에 연동을 해봅시다.
간단하게 spring-boot-starter-data-redis 패키지를 연동해줄겁니다.
위 패키지 의존성을 추가하면 Spring Data Redis 라이브러리와 함께 레디스 연결 드라이버, 레디스 사용 라이브러리르 ㄹ모두 사용할 수 있습니다.
참고로 Java에서 Redis Client로 사용하는 드라이버는 크게 두 가지가 있습니다.
하나는 Jedis이고, 다른 하나는 Lettuce입니다.
원래는 Jedis가 많이 사용되었으나 멀티스레딩 이슈나 여러가지 한계로 인하여 netty 기반의 보다 안정적인 Lettuce로 넘어가고 있고 Spring Boot 2.0부터는 Lettuce가 기본으로 사용되고 있습니다.
Redis에 명령을 실행할 수 있는 방법은 크게 두 가지로 나눌 수 있는데 RedisTemplate 클래스를 사용하는 방법과 Spring Data 프로젝트에서 제공하는 CrudRepository를 확장한 RedisReository를 사용하는 방법입니다.
RedisRepository를 사용하는 방식도 내부에선 RedisTemplate 스프링 빈에 의존합니다.
레디스를 주 저장소로 사용한다면 RedisRepository 방식을 사용하는 것이 좋고, 레디스를 저장소 뿐 아니라 여러 목적으로 활용하려면 RedisTemplate을 사용하는 것이 좋습니다.이번 데모 프로젝트에선 아주 가볍게만 테스트 해볼 예정이라 CrudRepository를 연동하여 테스트 해보겠습니다.
(다양한 타입을 저장하고 싶으시다면 RedisTemplate을 사용하시면 됩니다. 뭐 예를 들어 배열을 저장하고, Map을 저장하고 등등..)
📌 만들어봅시다.
새로운 프로젝트를 만들어줍니다.
저는 그냥 프로젝트 Name은 'redis-demo'라고 만들었습니다.
만들고나니 Gradle로 만들었어야 했는데 Maven으로 만들었네요..뭐 상관없습니다.
일단 pom.xml을 보시죠.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>redis-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>redis-demo</name> <description>redis-demo</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
lombok과 redis starter 패키지 이외에 다른 의존성은 없습니다.
자바 17을 사용했고 부트는 3.2.0입니다.
도커로 띄워놓은 redis 컨테이너에 접근하기 위해 아래와 같이 컨테이너의 접속정보를 기입해줍니다.
// application.yml spring: data: redis: host: localhost port: 6379
localhost에 6379번 포트로 연결하면 됩니다.
이제 Redis 환경 설정을 해보겠습니다. RedisConfig를 만들어줍니다.
@Configuration public class RedisConfig { @Value("${spring.data.redis.host}") private String host; @Value("${spring.data.redis.port}") private int port; @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(host, port); } }
application.yml에서 설정한 정보들을 토대로 LettuceConnectionFactory를 생성하는 redisConnectionFactory() 메서드를 만들어줍니다.
그럼 이제 Redis에 저장될 Object를 만들어주도록 하겠습니다.
가볍게 주문(Order) 클래스를 만들어 저장해보겠습니다.
@Getter @RedisHash(value = "order", timeToLive = 30) public class Order { @Id private String id; private Long orderNumber; private Integer orderCount; private LocalDateTime createAt; public Order(Long orderNumber, Integer orderCount) { this.orderNumber = orderNumber; this.orderCount = orderCount; this.createAt = LocalDateTime.now(); } }
레디스에서 사용할 객체는 @RedisHash를 사용해 keyspace(value)를 지정해주고, 지속시간(timeToLive)을 설정해주면 됩니다.
@Id는 Redis의 key로 사용되며 설정하지 않는다면 랜덤한 값이 입력되게 됩니다.
이 key는 keyspace와 함께 사용되며 keyspace:id 로 사용되게 됩니다.
그리고 Redis를 이용할 CrudRepository인 OrderRepository Interface를 만들어줍니다.
public interface OrderRepository extends CrudRepository<Order, String> { }
그리고 다음과 같이 TestCase를 만들어줍니다.
@SpringBootTest class RedisDemoApplicationTests { @Autowired private OrderRepository repository; @Test void orderTest() { Order order = new Order(1L, 3); // Redis에 Object 저장 repository.save(order); // key로 Object 조회 repository.findById(order.getId()); // Redis에서 Object 삭제 repository.delete(order); } }
repository에서 save를 호출하면 어떻게 될까요? 한 단계씩 따라가며 확인해보도록 하겠습니다.
우선 redis에 저장된 key들을 확인해보겠습니다.
저장된 Key는 없는 것으로 보입니다.
이제 Save를 호출하고 나서 Redis에 keys 를 조회해보겠습니다.
keyspace로 order가 생성되었고, 그 뒤에 id가 :를 경계로 생성되게 됩니다.
redis에 저장이 된 것이죠.
그리고 delete를 해봅니다.
당연히 redis에선 삭제가 되었겠죠.
timeToLive로 설정해놓았던 30초가 지나도 해당 Object는 메모리에서 사라지게 됩니다.
📌 마치며
Redis를 가지고 아주 가볍게 데이터를 저장하는 방식을 Spring Boot와 연동하여 알아보았습니다.
추후에 이걸 확장해서 실제 데이터를 메모리에 쓰고 해당 메모리에서 읽어오는 방식으로 테스트를 해보는 것을 예제 프로젝트로 작성하여 업로드 해놓겠습니다.
여러분의 개발에 조금이라도 도움이 되셨길..간절히 바라겠습니다 :D
'스터디 노트' 카테고리의 다른 글
Redis로 초간단 Pub / Sub 구축하기! Redis + Spring Boot (1) 2023.12.29 [Google Bard] 구글 바드 Spring Boot 연동하기! (feat. 제미나이 AI가 똑똑해졌다며?) (1) 2023.12.28 레디스란? 레디스의 백업 프로세스에 대하여 (0) 2023.12.20 Ubuntu(우분투) 환경에서 Java 초간편 설치하기 (0) 2023.12.13 Ubuntu 환경에서 Logstash와 Opensearch 연동하기 : logstash-input-opensearch Plugin input/output 설정 (0) 2023.12.13