그동안 생각만하고 직접 써보지는 않았던 DB인 redis,
새로운 기술에 대한 막연한 두려움때문에 그동안 쓰지 않았던 것 같다.
러닝커브에 대한 두려움이 늘 있어서 그랬던 것 같다.
헌데 회사일을 하면서 DB응답속도를 개선시키고 싶은 부분이 계속 생겨서 언젠간 꼭 배워야겠다고 마음을 먹었다.
주말인 오늘, 개념을 다시 훑어보고 직접 사용해본 경험을 아래에 적어두려고 한다.
Redis란 무엇일까요~?
빅천재맨들이 만든 갓구글에 검색하면 바로 아래와 같이 요약된 내용이 나온다
Redis는 REmote DIctionary Server의 약어입니다.
Redis는 속도가 빠르고 사용이 간편하여 최고의 성능이 필요한 웹, 모바일, 게임, 광고 기술 및 IoT 애플리케이션에서 널리 사용되고 있습니다.
조금 더 자세히 설명하면 아래와 같습니다.
왜 사용할까
영겁의 시간동안 백엔드 개발자들은 RDBMS를 사랑하고, 자주 사용해왔다.
하지만 대용량 데이터 저장, 비정형 데이터 저장, 빠른 응답시간 등의 새로운 요구 사항을 기존 RDBMS만으론 대응하기 어려울 때가 많았다.
그럴 때!
기존 RDBMS와 차별적인 강점을 갖춘 DB관리 프로그램인 Nosql을 찾게 되면서 자연스럽게 환경이 구성되게 되었다.
Nosql이 뭔데?
간단히 말하면 RDBMS가 아님을 의미하며, 여러 종류가 있다.
- 서로 연관된 그래프 형식의 데이터를 저장할 수 있는 Graph Store
- Row가 아닌 Column위주로 데이터를 저장하는 Column Store
- 비정형 대량 데이터를 저장하기 위한 Documnet Store
- 메모리 기반으로 빠르게 데이터를 읽어올 수 있는 Key-Value Store
여기서 Redis는 Key-Value Store에 속합니다.
Remote Dictionary Server의 약자인 Redis는 원격 Dictionary 자료구조 서버라는 직관적인 이름을 가지고 있습니다.
Key로 올수 있는 자료형은 기본적으로 String이지만, Value는 다양한 타입을 지원합니다.
이때 Redis의 강점은,
메모리 기반의 DB이기 때문에 Disk를 기반으로 하는 RDBMS보다 Read(조회) 속도가 빠릅니다.
- TTL 설정
> 일정시간이 지나면 데이터 삭제, 용량이 작은 메모리의 효율적 관리를 가능하게 함
- 분산 데이터 저장소 구성
> Redis Cluster 등 분산환경에서 안정적인 데이터 관리 가능
- 보안체계
> 악성 스크립트 공격으로부터 안전보장, TLS지원
아! 핵심적으로는
Read속도를 개선시키고 싶은 상황이 왔을 때 사용하기에 딱 좋은 구성을 지니고 있습니다.
한번, 사용해보기 위한 구성을 제 입맛대로 진행해보겠습니다.
저는 Docker-compose 사용법을 배웠으니, 활용할 겸 이를 접목시켜 진행해보겠습니다.
작업진행 순서
1. Redis Docker image활용하여 docker-compose로 redis 개설
2. Spring boot기준, redis dependency 설정
3. redis server와의 연결을 위한 properties 혹은 yml 설정
4. Configuration 작성 (기본적인 설정 및 Bean 의존성 주입을 위해)
5. 사용할 Entity 및 repository 작성 후 기본적인 CRUD 진행
이제 진행해보겠습니다.
- docker-compose.yml 작성
version: "3"
services:
redis:
image: redis
container_name: redis
hostname: redis
ports:
- "6379:6379"
docker-compose 실행
이쁘게 생성되었습니다
dependency 추가
dependencies {
...
//reids
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
redis server와의 연결을 위한 yml설정
spring:
redis:
host: 127.0.0.1
port: 6379
마주했던 문제상황
처음엔 host를 redis로 했는데, 계속 작동을 안 해서 갓 GPT에게 물어보니 127.0.0.1로 바꿔야한단다.
이유는 아래와 같이 설명했는데, 나는 아직도 이해를 못 해서 더 알아봐야 할 것 같다.
왜 host를 저렇게 했나요? (갓 GPT의 답변)
Redis 컨테이너의 호스트 이름을 "redis"로 설정하였지만, 호스트 이름을 인식하지 못하는 경우가 있을 수 있습니다. 호스트 이름을 직접 IP 주소로 변경하여 시도해 볼 수 있습니다. spring.redis.host: 127.0.0.1과 같이 호스트를 직접 지정해보세요.
Configuration 작성 (기본적인 설정 및 Bean 의존성 주입을 하기 위해)
package com.example.redissampleproejct;
import org.springframework.beans.factory.annotation.Value;
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.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
/**
* 내장 혹은 외부의 Redis를 연결
*/
@Bean
public RedisConnectionFactory redisConnectionFactory(){
return new LettuceConnectionFactory(host, port);
}
/**
* RedisConnection에서 넘겨준 byte 값 객체 직렬화
*/
@Bean
public RedisTemplate<?,?> redisTemplate(){
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
사용할 Entity 및 repository 작성 후 기본적인 CRUD 확인
package com.example.redissampleproejct;
import lombok.Builder;
import lombok.Getter;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@Getter
@Builder
@RedisHash(value = "people")
public class Person {
@Id
private String id;
private String name;
private Integer age;
}
package com.example.redissampleproejct;
import org.springframework.data.repository.CrudRepository;
public interface PersonRedisRepository extends CrudRepository<Person, String> {
}
package com.example.redissampleproejct;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
@RequiredArgsConstructor
public class redisController {
private final PersonRedisRepository personRedisRepository;
@GetMapping("/key")
public String test2() {
Person person = Person.builder()
.name("이승우")
.age(29)
.build();
personRedisRepository.save(person);
Optional<Person> findPerson = personRedisRepository.findById(person.getId());
return findPerson.get().getName() + " " + findPerson.get().getAge();
}
}
자, 이제 한번 http://localhost:8080/key 로 접속을 해보겠습니다.
기분이 좋습니다.
터미널을 통해 redis 서버에 들어가서 저장 또한 잘 되었는지 더블체크 해보도록 하겠습니다.
docker exec -it {container Id} redis-cli 명령어로 redis에 접속 후, key를 조회해보겠습니다.
Person 객체가 Redis에 두 개의 항목으로 저장되었습니다.
첫 번째 항목은 실제 데이터를 저장하고, 두 번째 항목은 해당 객체가 속한 해시 타입을 나타냅니다.
대략적인 사용법은 익혔습니다.
뭐든 처음이 어렵지, 중꺽마만 되새긴다면 결국엔 다 되는 것 같습니다.
다음에 실무에 도입하게 될 기회가 생기면, 버전2의 글을 정리해보도록 하겠습니다.
참조링크
https://kim-oriental.tistory.com/30
https://bcp0109.tistory.com/328
'개인공부' 카테고리의 다른 글
VPN VPC 개념 (1) | 2023.11.29 |
---|---|
Oauth2 (0) | 2023.10.16 |
자동 build Tool별 특징 및 장단점 (0) | 2023.05.20 |
헥사고날 아키텍처 개념 및 사용법 (0) | 2023.05.05 |
Dockerfile, Docker-compose 특징 및 차이 (0) | 2023.04.18 |
댓글