Springboot에서의 Redis활용

Redis의 개념을 먼저 간단하게 정리해보겠다.
Redis란?
Key, Value형태의 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템
Redis의 특징
- In-Memory 데이터 구조를 가진 저장소이다. 메모리에서 데이터를 처리하기 때문에 속도가 빠르다는 장점이 있다.
- String, List, Set, Hash 등의 자료 구조를 지원한다.
- Single Thread이기 때문에 한 번에 하나의 명령만 처리할 수 있다.
Redis의 단점
- In-Memory 데이터 구조이기 때문에 메모리 관리가 필요하며, 데이터 유실이 발생하기 쉽다.
- 한 번에 하나의 명령만 처리할 수 있기 때문에 처리하는데 시간이 오래 걸리는 요청은 피하는 것이 좋다.
Redis 설치 및 사용
필자는 맥북을 사용하기 때문에 맥에서의 Redis사용법을 처음부터 정리하고자 한다.
1. Redis설치
터미널에서 아래 명령어로 Redis를 설치하고 버전을 확인한다
brew install redis
redis-server --version
만약 brew command not found 오류가 발생한다면 터미널에서 homebrew를 먼저 설치한다.
이후 환경 변수를 설정한다
// M1 칩인 경우
export PATH=/opt/homebrew/bin:$PATH
// M1 칩이 아닌 경우
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
2. Redis실행
포그라운드에서 실행할 수도 있고, 백그라운드에서도 실행할 수 있지만 백그라운드에서의 실행을 다루겠다.
백그라운드에서 실행했을 때의 장점
- Redis가 시스템 부팅 후 자동으로 시작되도록 설정할 수 있다.
- 명령어를 통해 간단하게 중지시킬 수 있다.
- 로그가 기록되어 관리가 용이하다.
- 실행 후 터미널 창을 닫아도 Redis가 계속 실행된다.
brew services start redis
3. Redis 클라이언트로 점속
redis-cli
이외에 레디스 재실행, 중지, 키 조회, 데이터 삭제 등의 명령어를 활용하면 좋을 것 같다.
비밀번호 설정이나 암호화도 가능하고, 포트 번호도 설정할 수 있으니 이 부분에 대해서는 찾아서 적용해보도록 하자!
Spring에서의 Redis적용
1. 의존성 추가 및 yml파일 수정
먼저 gradle파일에서 의존성을 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
이후 yml파일을 수정한다.
설정값은 기본적으로 적용되어 있는 localhost:6379라고 가정하고 수정하였다.
Spring:
data:
redis:
host: localhost
port: 6379
2. 이후 RedisConfig를 통하여 Redis 설정을 한다
@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);
}
}
host와 port값을 yml파일에서 가져오고, RedisConnectionFactory를 통해 Redis에 연결하고, 명령을 보내고, 응답을 받을 수 있도록 해준다.
다양한 설정이 있으니 필요한 부분들은 찾아서 적용해보면 좋을 것 같다.
여기까지 설정을 하게 된다면 이제 정상적으로 Redis를 사용할 수 있을 것이다.
3. 예시로 객체를 하나 만들어 저장을 해보겠다.
먼저, Entity class를 생성한다.
@RedisHash
public class Person {
@Id
private String id;
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
Repository를 생성한다.
@Repository
public interface PersonRepository extends CrudRepository<Person, String> {
}
이후 테스트를 실행하면 저장된 데이터를 확인할 수 있다.
@Test
void test(){
Person person = new Person("KO", 25);
personRepository.save(person);
}