728x90
발표를 앞서
REDIS에 설치를 진행하면서 Local 문제가 발생하여 멘토님께 질문하고,
REDIS를 설치함으로써 에러가 발생하여 Spring이 올라간 Container가 Doker에서 떨어지면서 채점이 되지 않아 강사님께 질문하다가 REDIS와 Refresh 토큰을 시도하고 있다는 것을 들키면서 이 발표를 진행하게 되지 않았나 생각이 듭니다.
저보다 REDIS를 먼저 시도하고, 이미 프로젝트를 완료해 본 경험이 있으신 분들이 계실 것입니다.
저는 아직 완벽하게 성공을 이룬것이 아니고, 여전히 여러 방법을 시도 중에 있다는 것을 감안하고 발표를 들어주시면 감사하겠습니다.
틀린 점이나, 고민하고 있는 상황에 대해 답을 알고 계신 분은 댓글(또는 라운지 채널에)을 남겨주시면 감사하겠습니다. 꼭..!
REDIS 적용
REDIS는 무엇인가?
- Key - Value 구조로 데이터를 저장하고 관리하는 비관계형 데이터 베이스
- 데이터베이스, 캐시, 메세지 브로커 및 스트리밍 엔진으로 사용되는 오픈소스, 인메모리 데이터 구조 저장소.
- 문자열, 해시, 리스트, 셋, 비트맵, 인덱스 및 스트림과 같은 데이터 구조 제공
왜 REDIS를 사용하는가?
성능
더보기
- 모든 Redis 데이터는 메모리에 상주하므로 데이터 액세스의 대기 시간을 낮추고 처리량을 높임.
- 평균 읽기 및 쓰기 작업 속도가 1밀리초 미만이라는 놀랍도록 빠른 성능으로 초당 수백만 건의 작업을 지원.
유연한 데이터 구조
더보기
- 제한적인 데이터 구조를 제공하는 다른 키 값 데이터 스토어와 달리 Redis에서는 애플리케이션 요구 사항을 충족할 수 있는 다양한 데이터 구조를 지원. Redis 데이터 유형은 다음과 같습니다.
- 문자열 – 최대 512MB 크기의 텍스트 또는 바이너리 데이터
- 목록 – 추가된 순서가 유지되는 문자열 모음
- Sets – 순서가 유지되지 않는 문자열 모음으로 다른 세트 유형과 교차, 통합 및 비교 가능
- Sorted Sets – 값을 기준으로 순서가 지정된 세트
- Hashes – 필드 및 값의 목록을 저장하는 데이터 구조
- Bitmaps – 비트 수준 작업을 제공하는 데이터 유형
- HyperLogLogs – 데이터 집합 내 고유 항목을 추정하기 위한 확률적 데이터 구조
- Streams - 로그 데이터 구조 메시지 대기열
- Geospatial - 경도/위도 기반 항목 맵, ‘인근’
- JSON - 숫자, 문자열, 부울, 배열 및 기타 개체를 지원하는 명명된 값의 중첩된 반정형 객체
단순성 및 사용 편의성
더보기
- Redis를 사용하면 더 짧고 단순한 코드로 기존의 복잡한 코드를 작성가능.
- Redis에서는 더 짧은 코드를 작성하여 애플리케이션 데이터의 저장, 액세스 및 사용을 지원.
- Redis를 사용하는 개발자는 기존 데이터베이스의 쿼리 언어와 반대되는 단순한 명령 구조 사용.
- Redis 개발자는 백 개가 넘는 오픈 소스 클라이언트를 사용 가능, Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go 및 기타 언어를 비롯한 다수의 언어 지원.
복제 및 지속성
더보기
- Redis는 기본-복제 아키텍처를 사용하며 비동기식 복제를 지원하므로 데이터가 여러 복제 서버에 복제가능.
- 주 서버에 장애가 발생하는 경우 요청이 여러 서버로 분산될 수 있으므로 향상된 읽기 성능과 더 빠른 복구 기능을 제공.
- Redis는 지속성을 위해 특정 시점 백업(Redis 데이터 집합을 디스크로 복사)을 지원합니다.
- Redis는 내구성 및 일관성을 제공하는 데이터베이스로 구축되지 않았기 때문에, 내구성이 뛰어난 Redis 호환 데이터베이스가 필요하다면 Amazon MemoryDB for Redis를 사용하는 것을 권장.
- MemoryDB는 데이터를 여러 가용 영역(AZ)에 저장하여 내구성을 높이는 트랜잭션 로그를 사용하므로 프라이머리 데이터베이스로 사용가능.
- MemoryDB는 개별 캐시, 데이터베이스 또는 기반 인프라 관리에 대한 걱정 없이 Redis API를 사용할 수 있도록 특별히 구축되었습니다.
고가용성 및 확장성
더보기
- Redis는 단일 노드 기본 또는 클러스터링된 토폴로지에서 기본-복제 아키텍처를 제공.
- 가용성이 뛰어난 솔루션을 구축하여 일관된 성능과 안정성을 제공.
- 클러스터 크기를 조정해야 하는 경우, 스케일업, 스케일인 또는 스케일아웃할 수 있는 다양한 옵션이 제공.
- 수요에 맞춰 클러스터를 확장할 수 있습니다.
오픈 소스
더보기
- Redis는 개방형 표준을 기반으로 하고 오픈 데이터 형식을 지원하며 다양한 클라이언트 세트를 제공하므로 공급업체 종속이나 기술 종속이 없음.
REDIS의 주요 사용 사례
캐싱
더보기
- Redis는 데이터 액세스 지연 시간을 줄이고, 처리량을 늘리며, 관계형 또는 NoSQL 데이터베이스와 애플리케이션의 로드를 줄일 수 있는 가용성이 뛰어난 인 메모리 캐시 구현에 매우 적합.
- Redis를 사용하면 빈번하게 요청되는 항목을 1밀리 초 미만의 응답 시간으로 지원 가능, 고가의 백엔드를 추가하지 않고 손쉽게 확장하여 더 많은 로드를 처리.
- 데이터베이스 쿼리 결과 캐싱, 영구 세션 캐싱, 웹 페이지 캐싱, 주파수 사용 객체(이미지, 파일, 메타데이터 등) 캐싱은 Redis를 사용한 캐싱의 주요 예.
채팅, 메시징 및 대기열
더보기
- Redis는 패턴 매칭과 다양한 데이터 구조(목록, 정렬된 세트, 해시 등) 옵션으로 게시/구독을 지원.
- Redis에서는 고성능 채팅방, 실시간 코멘트 스트림, 소셜 미디어 피드 및 서버 상호 통신을 지원.
- Redis 목록 데이터 구조를 사용하면 간단한 대기열을 손쉽게 구현할 수 있습니다.
- 목록은 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있는 메시지 브로커 또는 순환 목록이 필요한 다양한 애플리케이션에 적합.
게임 순위표
더보기
- Redis는 실시간 순위표를 구축하려는 게임 개발자에게 인기 있는 서비스.
- 요소의 고유성을 제공하면서 점수로 정렬된 목록을 유지하는 Redis Sorted Set 데이터 구조를 사용.
- 실시간 순위 목록을 생성하는 것은 사용자의 점수가 변경될 때마다 이를 업데이트하는 것만큼 쉬움.
- 타임스탬프를 점수로 사용함으로써 Sorted Set를 통해 시계열 데이터를 처리 가능.
세션 스토어
더보기
- 고가용성과 지속성을 갖춘 인 메모리 데이터 스토어인 Redis는 인터넷 규모의 애플리케이션을 위해 세션 데이터를 저장 및 관리하려는 애플리케이션 개발자에게 인기 있는 서비스.
- Redis는 사용자 프로필, 자격 증명, 세션 상태, 사용자별 개인화 등과 같은 세션 데이터를 관리하는 데 필요한 1밀리초 미만의 지연 시간, 규모 및 복원력을 제공.
다양한 미디어 스트리밍
더보기
- Redis는 라이브 스트리밍 사용 사례를 지원할 수 있는 빠른 인 메모리 데이터 스토어를 제공.
- Redis는 CDN이 동시에 수백만 명의 모바일 및 데스크톱 사용자에게 비디오를 스트리밍할 수 있도록 사용자 프로필 및 열람 기록에 대한 메타데이터, 수백만 사용자의 인증 정보/토큰, 매니페스트 파일을 저장하는 데 사용.
지리 공간
더보기
- Redis는 대규모의 실시간 지리 공간 데이터를 빠르게 관리할 수 있도록 특별히 구축된 인 메모리 데이터 구조 및 연산자를 제공.
- 지리 공간 데이터를 실시간으로 저장, 처리 및 분석하는 GEOADD, GEODIST, GEORADIUS 및 GEORADIUSBYMEMBER와 같은 명령을 사용하면 Redis에서 쉽고 빠르게 지리 공간을 처리 가능.
- Redis를 사용하여 주행 시간, 주행 거리, 안내 표시와 같은 위치 기반 기능을 애플리케이션에 추가 가능.
Machine Learning
더보기
- 데이터 중심의 최신 애플리케이션에서 데이터의 막대한 볼륨, 다양성 및 속도를 신속하게 처리하고 의사 결정을 자동화하기 위해서는 기계 학습이 필요.
- 게임 및 금융 서비스에서 사기 탐지, 게임 기술에서 실시간 입찰, 데이트 및 카풀 서비스에서 매치메이킹과 같은 사용 사례의 경우, 수십밀리초 이내로 라이브 데이터를 처리하고 의사 결정을 내릴 수 있는 성능이 가장 중요합니다. Redis는 기계 학습 모델을 신속하게 구축, 교육 및 배포할 수 있는 빠른 인 메모리 데이터 스토어를 제공.
실시간 분석
더보기
- Redis는 Apache Kafka, Amazon Kinesis 등과 같은 스트리밍 솔루션에 인 메모리 데이터 스토어로 사용하여 1밀리 초 미만의 지연 시간으로 실시간 데이터를 수집, 처리 및 분석 가능.
- Redis는 소셜 미디어 분석, 광고 타게팅, 개인화 및 IoT와 같은 실시간 분석 사용 사례에 적합.
REDIS를 왜 사용하려 했는가?
- JWT 발급시, Refresh Token을 저장하기 위함.
- ACCESS_TOKEN의 경우 서버에 저장할 필요가 없으나, REFRESH_TOKEN의 경우 저장소에 따로 저장하여 검증에 활용해야함. 또한 REFRESH_TOKEN의 경우 서버에 따로 저장하기 때문에 강제로 토큰을 만료하는 것이 가능.
- 그렇다면 로그아웃도 구현하기 편해지지 않을까..!
Refresh Token을 저장하는데 왜 REDIS를 사용하는가?
- 빠른 액세스 속도로 인하여 사용자 로그인, 즉 Refresh Token 발급 시 병목이 되지 않기 때문.
REDIS 설치
- Window 설치를 지원하지 않으므로, Ubuntu 환경에서 Docker를 통하여 설치합니다.
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release -y
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli -y
- Docker에서 REDIS 설치를 지원하고 있으므로 다음 명령어를 입력합니다.
docker pull redis
- pull 받은 redis를 실행시킵니다.
docker run --name some-redis -p 6379:6379 -d redis
- Redis-cli에 접속하려면 다음과 같은 명령어를 입력합니다.
docker exec -it some-redis redis-cli
REDIS Spring 설치
- Gradle 의존성을 추가합니다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
- application.yml HOST, PORT를 추가합니다.
spring:
redis:
host: localhost # 저는 EC2 환경이므로 EC2 DNS 주소를 입력하였습니다.
port: 6379
- RedisConfig.class를 생성합니다.
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory(){
return new LettuceConnectionFactory(host, port);
}
}
Redis Repository VS Redis Templates
- Redis Templates
- 자료구조로 저장이 가능
- 트랜잭션 미지원
- Redis Repository를 사용하면, 객체를 Redis에 저장할 수 있습니다.
- 객체를 저장 가능
- 트랙잭션 지원
Redis Repository
- Entity 작성
@AllArgsConstructor
@Getter
@RedisHash(value = "jwt", timeToLive = 30)
public class Token {
@Id
private Long id;
private String accessToken;
private String refreshToken;
}
- Token Repository 작성
public interface TokenRedisRepository extends CrudRepository<Token, Long> {
}
Redis Templates
- RedisConfig 하단에 Reids Template를 추가합니다.
@Configuration
public class RedisConfig {
...
@Bean
public RedisTemplate<?, ?> redisTemplate(){
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
- Redis Dao.Class를 생성합니다.
@Component
public class RedisDao {
private final RedisTemplate<String, String> redisTemplate;
public RedisDao(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void setValues(String key, String value) {
ValueOperations<String, String> values = redisTemplate.opsForValue();
values.set(key, value);
}
public void setValues(String key, String value, Duration duration) {
ValueOperations<String, String> values = redisTemplate.opsForValue();
values.set(key, value, duration);
}
public void setValues(String key, String value, long timeout, TimeUnit unit) {
ValueOperations<String, String> values = redisTemplate.opsForValue();
values.set(key, value, timeout, unit);
}
public String getValues(String key) {
ValueOperations<String, String> values = redisTemplate.opsForValue();
return values.get(key);
}
public void deleteValues(String key) {
redisTemplate.delete(key);
}
}
REDIS Templates사용 사례
UserService의 Login 부분
Talend API를 사용하여 API 확인
발급받은 Refresh Token이 Redis에 Key:Value 형식으로 들어가 있는 것을 확인할 수 있다.
REDIS Repository 사용 사례
@SpringBootTest
class TokenRedisRepositoryTest {
@Autowired
TokenRedisRepository tokenRedisRepository;
@Test
void test(){
Token token = new Token(1l, "access_token", "refresh_token");
tokenRedisRepository.save(token);
tokenRedisRepository.findById(token.getId());
tokenRedisRepository.count();
}
}
사용 결과
프로젝트 구조
MEDIS란?
- REDIS를 위한 GUI 프로그램
REDIS 적용 Repository
PPT
참조 및 도움 자료
반응형
'회고록 > Archive' 카테고리의 다른 글
[Team Project] 멋사 백엔드 스쿨 종합 프로젝트 - 엔드포인트 정리 (0) | 2023.01.20 |
---|---|
[Team Project] 멋사 백엔드 스쿨 종합 프로젝트 - 아이디어톤 (0) | 2023.01.20 |
[Project] 09. SNS 웹 서비스 제작 (0) | 2023.01.05 |
[Project] 08. SNS 웹 서비스 제작 (1) | 2023.01.04 |
[Project] 07. SNS 웹 서비스 제작 (1) | 2022.12.29 |