들어가기 전에
버즈덤 프로젝트에서는 Spring Security와 JWT를 통해 인증 및 인가 처리를 하는데 이때 Token 저장소로 Redis를 사용하기로 했다. 같이 하시는 팀원 분 파트였는데 하시는 데 어려움을 겪으셔서 내가 연결 정보만 넘겨드리기로 하면서 Redis를 조금이나마 경험할 수 있었다.
사실 설치하고 사용하는 과정까지는 크게 어렵지 않지만 혹시나 나처럼 실수를 겪는 분이 있을까봐 글을 작성하게 됐다. 공식 문서나 블로그 글이나 큰 차이가 없을 것이라고 생각해서 "Redis 설치"를 검색하고 상위에 뜨는 블로그 글들의 설치 방법을 그대로 따라했다가 계속 오류가 나서 생각보다 시간을 쏟게 되었었기 때문이다. 🥲
역시 올타임 교훈은 뭐다? 공식 문서를 참고하자!
설치하기
1. APT 인덱스에 Repository 를 추가한다.
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
2. 설치 가능한 패키지 리스트를 업데이트한 후 레디스를 설치한다.
sudo apt-get update
sudo apt-get install redis
설치 완료 후에는 아래 명령어로 버전 정보를 확인할 수 있다.
sudo redis-server --version
3. 설정 정보를 추가 및 변경한다.
1) 설정 파일을 연다.
sudo nano /etc/redis/redis.conf
2) 아래 키워드들을 찾아 주석을 풀고 내용을 입력한다.
bind 0.0.0.0 ::1
requirepass [비밀번호]
port 6379
maxmemory 500m
maxmemory-policy allkeys-lru
- bind : IP 접근에 대한 설정으로 모든 IP에 대한 접근을 허용한다.
- requirepass : 설정 정보에 사용할 비밀번호를 설정한다.
- port : 포트 번호는 6379번으로 지정하면 된다.
- maxmemory : 최대 메모리를 설정한다.
- maxmemory-policy : Data eviction 전략을 선택한다.
Data eviction 전략
3) 레디스를 재실행한다.
sudo systemctl restart redis-server.service
프로젝트에 적용하기
1. 의존성을 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
2. 연결 정보를 추가한다.
spring:
redis:
port: 6379
host: [Public IP]
password: [비밀번호]
비밀번호는 Redis 설정 정보에 추가했던 정보를 기입하면 된다.
3. 설정 클래스를 생성한다.
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private String redisPort;
@Value("${spring.redis.password}")
private String redisPassword;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisHost);
redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort));
redisStandaloneConfiguration.setPassword(redisPassword);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
return lettuceConnectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
간단히 테스트해보기
redis-cli로 값을 저장하고 그 값을 확인하는 API를 생성해보자.
1. redis-cli로 서버에 접속한다.
reids-cli
2. 키-값을 설정한다.
set [key] [value]
set test test-value
3. 추가된 Key의 Value를 가져오기 위한 Controller와 Service 코드를 작성한다.
RedisSampleController
@Controller
@RequiredArgsConstructor
public class RedisSampleController {
private final RedisSampleService redisSampleService;
@GetMapping(value = "/redis/{key}")
public String getRedisStringValue(@PathVariable String key) {
return redisSampleService.getRedisStringValue(key);
}
}
RedisSampleService
@Service
@RequiredArgsConstructor
public class RedisSampleService {
private final StringRedisTemplate stringRedisTemplate;
public String getRedisStringValue(String key) {
ValueOperations<String, String> stringValueOperations =
stringRedisTemplate.opsForValue();
return stringValueOperations.get(key);
}
}
- StringRedisTemplate : Redis의 Template 중 문자열 중심으로 확장된 템플릿이다.
- StringRedisTemplate.opsForValue() : 문자열 값에 대해 수행된 작업 결과를 반환한다.
- ValueOperations : 문자열 값을 위한 Redis의 작업 클래스이다. (그외에는 ListOperations, SetOperations 등이 있다.)
4. API 테스트를 해서 반환되는 값을 확인한다.
localhost:8080/redis/test
반환 데이터
test-value
참고
'노트 > F-lab' 카테고리의 다른 글
가변 인자를 다루기 위한 Functional Interface 활용 (0) | 2023.07.01 |
---|---|
동시성 제어와 DB 설계의 고민 (0) | 2023.06.23 |
Github Actions: CI/CD 구축 (feat. Docker) (0) | 2023.06.21 |
RabbitMQ를 활용한 메시지 처리 방식 구현: 설치부터 적용까지 (0) | 2023.06.17 |
Github Actions: CI/CD 구축 (feat.shell script) - 실전편 (2) | 2023.06.04 |