레디스는 Remote Dictionary Server의 약자로서, "키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템이다.
** 외부 캐시로 사용할 때
1)
로그인 정보를 공유하기위해서 redis를 활용. 로그인 요청이 들어왔을 때 내부에 저장하지 않고 세션 아이디는 클라이언트에서 관리하니까 이 키 값을 redis에 저장한다. 그리고 다른 서버에서 사용자가 접근할 때 redis를 통해서 확인한다.
2)
레빗엠큐랑 합쳐서 비동기 데이터 처리에서도 사용할 수 있다. 프로듀서는 메시지 큐에 요청을 적재하고 메시지 큐에서 요청을 확인하고 그 결과를 redis를 이용해 처리된 결과를 적재하고 그 결과를 조회한다.
우리는 2번에 해당하는 시나리오를 실습하고자 한다.
Windows 환경에 맞는 Redis의 경우 이미 지원이 중단되었다. Windows에 자체적으로 실행할 수 있는 Redis의 마지막 버전은 마이크로소프트에서 아카이브 형태로 제공하고 있다.
Releases · microsoftarchive/redis
여기서 상단의 zip파일을 받아서 압축 해제하면 임시로 사용해 볼 수 있다.
압축 해제하면 여러 파일들이 나오는데,
이중에서 redis-server 를 실행하면 된다.
해당 창을 종료하면 redis 역시 종료된다.
producer, consumer 프로젝트를 열고 아래와 같이 입력한다.
두 개의 프로젝트 모두 application.yml 로 파일 이름을 바꾸고 producer는 8080, consumer는 8081로 포트 번호를 변경한다.
그리고 프로젝트 둘 다 build.gradle에 드레그 한 부분을 추가한다.
그리고 이제 producer 프로젝트에 model 패키지를 만들고 그 안에 JobRequest.java, JobProcess.java 파일을 만든다.
JobRequest.java는 아래와 같이 작성한다.
그리고 JobProcess.java 도 아래와 같이 작성한다. Getter/Setter 과 toString 도 같이 작성해준다.
그리고 config 패키지에 RedisConfig.java 파일을 생성한 후 아래와 같이 작성한다.
다음으로는 redis와 실제로 상호작용을 하기 위한 레포지토리를 만들어야한다. 따라서 repository 패키지를 만든 후 RedisRepository.java (인터페이스) 파일을 만들고 아래와 같이 작성한다.
그리고 ProducerService.java에서 보내는 부분을 고쳐보자. 먼저 26~27줄, 31~38줄(주석 처리한 부분) 을 지운다.
그리고 아래 처럼 코드를 작성하는데
그런데 이렇게 작성하면 json의 형태로 나오지 않는다. 따라서 json으로 표현하기 위한 라이브러리를 build.gradle에 추가한다. (consumer 프로젝트에도 추가한다!)
implementation 'com.google.code.gson:gson:2.9.0'
그 다음 gson을 제공하는 bean을 만들어보자. ProducerConfig.java에서 아래와 같이 작성한다.
그리고 이를 사용할 ProducerService.java 부분을 수정한다.
19,24,28번째 줄 추가, 31,34~36번째 줄 수정
위에서 send() 메소드를 수정했으니 이를 사용하는 ProducerController.java 도 아래와 같이 수정해준다.
producer 프로젝트의 수정은 끝났다. 이제 consumer 프로젝트를 수정해보자. config 패키지 안에 RedisConfig.java 파일을 만들고 producer에서 만들었던 RedisConfig.java 내용을 복사해서 똑같이 붙여넣기한다.
그리고 producer 프로젝트에서 만들었던 model 패키지와 JobProcess.java, JobRequest.java를 그대로 작성한다.
그리고 마찬가지로 ConsumerConfig.java 에서 아래 코드를 추가한다.
그리고 repository 패키지를 만들고 그 안에 RedisRepositry.java 파일을 생성한 뒤 producer에서와 똑같이 작성한다.
그리고 ConsumerService.java에서 메시지를 받을 부분을 작성해보자.
먼저 기존 코드에서 19,20,22~28번째 코드를 작성한다.
그리고 receive() 메소드를 수정한다.
그리고 이제 다시 producer 프로젝트로 가서 RedisService.java 파일을 생성하고 아래와 같이 작성한다.
그리고 이 함수를 사용할 controller를 작성한다. ProducerController.java 에서 아래와 같이 코드를 추가한다.
그러면 끝!
producer 프로젝트를 실행해보면 아이디 값이 나오고
그 아이디를 url에 입력하면 아이디와 상태가 뜨고 5초가 지나면 종료되는 것을 확인할 수 있다.
이런 식으로 진행하면 서버에서 받아야할 부하들을 클라이언트와 분산할 수 있다.