-
Redis 스프링부트에서 Redis 사용DBMS/Redis 2024. 9. 16. 22:54728x90반응형
Redis 스프링부트에서 Redis 사용
스프링 부트의 캐시는 대부분 JSR-107을 따른다.
JSR(Java Specification Requests)은 자바에 대한 기술적 기능에 대한 스펙들을 정의해놓은 것이다.
JSR-107은 그 중에서 캐시에 대한 것들을 다루고 있다.
JSR-107을 따르는 캐시를 사용하면 어떤 구현체를 사용하든 상관없이 추상화를 지원해준다.
제목처럼 오늘 사용할 것은 Redis인데,
in-Memory DB이면서,
비정형 데이터를 다루는 오픈소스 NoSQL이다.
in-Memory
하드디스크나 SSD가 아닌 RAM에 데이터를 올려서 사용한다.
저장, 조회 시에 하드디스크를 거치지 않아도 되서 속도가 빠르다.
비정형 데이터
정의된 구조가 없이 정형화되지 않은 데이터
대표적으로 동영상, 오디오, 사진 등이 있다.
비정형 데이터는 데이터 구조가 없어서
비정형 데이터 자체만으로는 내용에 대한 질의 처리를 할 수 없다.
1. 의존성 추가
implementation("org.springframework.boot:spring-boot-starter-data-redis")
자바에서는 Redis 관련해서 크게 2가지가 있는데, Jedis와 Lettuce다.
스프링부트 2.0 이후로는 기본으로 Lettuce를 사용한다.
2. application.properties 설정
spring: data: redis: host: localhost port: 6379
3. RedisConfig 클래스 추가
@Configuration public class RedisCacheConfig implements CacheConfig { @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); } }
docker에 올려서 사용할 거라서 docker에 띄워보자.
4. docker에 설정
docker-compose-redis.yml 파일이다.
version: '3' services: aroundhub_redis: image: redis:7.0.0 restart: always ports: - '6379:6379'
docker-compose-redis.yml 파일이다.
cmd로 이동하자.
docker가 있는 폴더로 이동하자
참고로 경로 이동 명령어는 cd `이동할 경로`다.
docker-compose -f docker-compose-redis.yml up -d 입력
docker-compose
Docker Compose 명령어를 실행한다.
Docker Compose는 여러 컨테이너를 정의하고 실행하기 위한 도구입니다.
-f
Docker Compose는 기본적으로 커맨드가 실행하는 디렉토리에 있는
docker-compose.yml 또는 docker-compose.yaml를 설정 파일로 사용한다.
다른 이름이나 경로의 파일을 Docker Compose 설정 파일로 사용하고 싶다면 -f 옵션으로 명시를 해준다.
여기서는 docker-compose-redis.yml 파일을 사용하여 Redis와 관련된 설정을 로드한다.
up
정의된 컨테이너를 생성하고 시작하는 역할을 합니다.
-d
이 옵션은 "detached" 모드로 실행하도록 지정한다.
즉, 컨테이너가 백그라운드에서 실행되며, 명령어가 즉시 프롬프트로 돌아오게 된다.
이렇게 도커에 올라와있는 걸 볼 수 있다.
docker exec -it docker-example_redis-1 redis-cli 입력
docker exec
실행 중인 Docker 컨테이너에서 명령어를 실행하는 명령어이다.
-it
두 개의 옵션이 함께 사용된다.
-i (interactive): 표준 입력(STDIN)을 열어 주며, 상호작용이 가능하도록 한다.
-t (tty): 가상 터미널을 할당하여, 명령어의 출력을 터미널에서 보기 좋게 만든다.
docker-example_redis-1
Redis 서버가 실행 중인 Docker 컨테이너의 이름이다.
docker-compose 파일에서 설정한 서비스 이름과 컨테이너의 인스턴스 번호를 포함할 수 있다.
redis-cli
Redis의 커맨드라인 인터페이스 도구이다.
Redis 서버와 직접 상호작용할 수 있다.
5. 관련 설정
@RedisHash(value = "shortUrl", timeToLive = 60)
이 태그를 통해, 저장되는 값에 대한 설정을 할 수 있다.
value 속성은, 해당 값에 접두사로 사용된다.
@Id 어노테이션이 붙은 변수와 함께
`@RedisHash 어노테이션의 value값`:`@Id 어노테이션의 멤버 변수 값`의 형태를 띄게 된다.
눈치챘겠지만 key-value형태로 저장하는 Redis에서, @Id가 붙은 멤버변수가 key로 사용된다.
timeToLive는 이름에서 느껴지듯이 저장해둘 시간을 의미한다.
s(초)단위를 사용한다.
6. 사용 예시
6 -1 Repository 생성
public interface ShortUrlRepository extends JpaRepository<ShortUrl, Long> { ShortUrl findByUrl(String url); ShortUrl findByOrgUrl(String originalUrl); }
위 코드는 JPA를 이용한 repository를 만든 코드이다.
Redis는 이것과 비슷한 형태를 띄는데,
아래 코드를 보자.
public interface ShortUrlRedisRepository extends CrudRepository<ShortUrlResponseDto, String> {}
Redis는 CrudRepositroy를 상속받게 만들면 된다.
이걸 실제로 사용할 때도, JPA처럼 규약에 맞춰서 기본적인 CRUD가 만들어져 있다.
findBy어쩌고.. 같은 것들 처럼
진짜 핵심은 아래 코드이다.
6 - 2. Service 수정
Redis에 등록
// Cache Logic shortUrlRedisRepository.save(shortUrlResponseDto); LOGGER.info("[generateShortUrl] Response DTO : {}", shortUrlResponseDto);
post 방식으로 뭔가를 등록할 때, Redis에 등록해주는 것이다.
Redis에서 조회
// Cache Logic Optional<ShortUrlResponseDto> foundResponseDto = shortUrlRedisRepository.findById(originalUrl); if (foundResponseDto.isPresent()) { LOGGER.info("[getShortUrl] Cache Data existed."); return foundResponseDto.get(); } else { LOGGER.info("[getShortUrl] Cache Data does not existed."); } // ...~~
조회할 때 Redis저장소에서 먼저 찾아보고, 있다면 Redis에서 조회해준다.
그러면 아래의 긴 로직들을 수행할 필요 없이 바로 return문이 실행되면서 메서드를 빠져나간다.
하지만 없다면 우리가 원래 사용하던 DB에서 조회하도록 차근차근 원래의 로직들을 실행해나간다.
728x90반응형'DBMS > Redis' 카테고리의 다른 글
Redis 설치 및 간단한 동작 (0) 2024.09.09