1. 개요
Memorystore for Redis는 Google Cloud를 위한 완전 관리형 Redis 서비스입니다. Google Cloud에서 실행되는 앱은 복잡한 Redis 배포를 관리할 필요 없이 확장성, 가용성, 안전성이 뛰어난 Redis 서비스를 활용하여 성능을 극대화할 수 있습니다. Spring Boot 앱의 성능을 개선하기 위해 데이터 캐싱의 백엔드로 사용할 수 있습니다. Codelab에서는 설정 방법을 설명합니다.
학습할 내용
- Memorystore를 Spring Boot 앱의 캐시 백엔드로 사용하는 방법
필요한 항목
- Google Cloud 프로젝트
- 브라우저(예: Chrome)
- Vim, Emacs, GNU Nano와 같은 표준 Linux 텍스트 편집기에 관한 기본 지식
Codelab을 어떻게 사용할 계획인가요?
<ph type="x-smartling-placeholder">귀하의 Google Cloud 서비스 경험을 평가해 주세요.
<ph type="x-smartling-placeholder">2. 설정 및 요구사항
자습형 환경 설정
- Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)
모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID
라고 부릅니다.
- 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.
이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
이전에 Cloud Shell을 시작하지 않았으면 설명이 포함된 중간 화면(스크롤해야 볼 수 있는 부분)이 제공됩니다. 이 경우 계속을 클릭합니다(이후 다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
가상 머신은 필요한 모든 개발 도구와 함께 로드됩니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. Memorystore for Redis 인스턴스 설정
Cloud Shell을 시작합니다.
Cloud Shell이 실행되면 명령줄을 사용하여 Memorystore API를 사용 설정하고 새 Memorystore 인스턴스를 만듭니다.
$ gcloud services enable redis.googleapis.com $ gcloud redis instances create myinstance --size=1 --region=us-central1
작업이 완료되면 인스턴스를 사용할 수 있습니다.
다음 명령어를 실행하여 인스턴스의 redis 호스트 IP 주소를 가져옵니다. 나중에 Spring Boot 앱을 구성할 때 다시 사용합니다.
$ gcloud redis instances describe myinstance --region=us-central1 \ | grep host host: 10.0.0.4
Google Cloud 콘솔에서 데이터베이스 > Memorystore > Redis 인스턴스가 '준비됨' 상태여야 합니다. 상태 :
4. Compute Engine 인스턴스 설정
동일한 리전에 Compute Engine 인스턴스를 만듭니다.
$ gcloud compute instances create instance-1 --zone us-central1-c
작업이 완료되면 인스턴스를 사용할 수 있습니다.
다음 명령어를 사용해 SSH를 통해 인스턴스에 연결합니다.
$ gcloud compute ssh instance-1 --zone us-central1-c
또는 컴퓨팅 > Compute Engine VM 인스턴스를 클릭하고 연결 열에서 SSH를 클릭합니다.
Cloud Shell이 아닌 가상 머신(VM) 인스턴스 셸에서 OpenJDK, Maven, Redis 도구를 설치합니다.
$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools
설치가 완료될 때까지 기다린 후 다음 단계로 진행합니다.
5. Spring Boot 앱 설정
web
, redis
, cache
종속 항목이 있는 새 Spring Boot 프로젝트를 만듭니다.
$ curl https://start.spring.io/starter.tgz \ -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \ -d type=maven-project \ | tar -xzvf - && cd cache-app
application.properties
파일을 수정하여 앱이 Redis용 Memorystore 인스턴스 호스트의 IP 주소를 사용하도록 구성합니다.
$ nano src/main/resources/application.properties
몇 단계 전의 Memorystore for Redis IP 주소와 함께 다음 줄을 추가합니다.
spring.data.redis.host=<memorystore-host-ip-address>
그 뒤에 새 줄을 추가하고 REST 컨트롤러 Java 클래스를 만듭니다.
$ nano src/main/java/com/example/demo/HelloWorldController.java
파일에 다음 콘텐츠를 넣습니다.
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@Autowired
private StringRedisTemplate template;
@RequestMapping("/hello/{name}")
@Cacheable("hello")
public String hello(@PathVariable String name) throws InterruptedException {
Thread.sleep(5000);
return "Hello " + name;
}
}
@RequestMapping
주석은 메서드를 HTTP 엔드포인트로 노출하고 경로의 일부를 메서드 매개변수 (@PathVariable
주석으로 표시된 대로)에 매핑합니다.
@Cacheable("hello")
주석은 메서드 실행이 캐시되어야 하고 캐시 이름이 'hello
'임을 나타냅니다. 매개변수 값과 함께 캐시 키로 사용됩니다. Codelab 후반부에서 예시를 확인할 수 있습니다.
다음으로 Spring Boot 앱 클래스에서 캐싱을 사용 설정합니다. DemoApplication.java
수정:
$ nano src/main/java/com/example/demo/DemoApplication.java
org.springframework.cache.annotation.EnableCaching
를 가져오고 이 주석을 사용하여 클래스에 주석을 추가합니다. 다음과 같은 결과가 표시됩니다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6. 앱 실행 및 엔드포인트에 액세스
JAVA_HOME
이 올바른 버전으로 설정되어 있는지 확인합니다.
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
이제 앱을 실행할 준비가 되었습니다.
$ mvn spring-boot:run
이전과 동일한 방식으로 인스턴스에 대한 다른 SSH 연결을 엽니다. 새 SSH 창에서 /hello/
엔드포인트에 여러 번 액세스하여 'bob
'를 전달합니다. 이름을 입력합니다.
$ time curl http://localhost:8080/hello/bob Hello bob! real 0m5.408s user 0m0.036s sys 0m0.009s $ time curl http://localhost:8080/hello/bob Hello bob! real 0m0.092s user 0m0.021s sys 0m0.027s
첫 번째 요청은 5초가 걸렸지만 다음 요청은 메서드에 Thread.sleep(5000)
를 호출했음에도 불구하고 훨씬 더 빨랐습니다. 실제 메서드가 한 번만 실행되고 결과가 캐시에 저장되었기 때문입니다. 이후의 모든 호출은 캐시에서 직접 결과를 반환합니다.
7. 캐시된 객체 검토
앱이 실제로 무엇을 캐시했는지 정확히 확인할 수 있습니다. 이전 단계에서 사용한 것과 동일한 터미널에서 redis-cli를 사용하여 Memorystore for Redis 호스트에 연결합니다.
$ redis-cli -h <memorystore-host-ip-address>
캐시 키 목록을 보려면 다음 명령어를 사용합니다.
:6379> KEYS * 1) "hello::bob"
보시다시피 캐시 이름은 키의 접두사로 사용되고 매개변수 값은 두 번째 부분으로 사용됩니다.
값을 검색하려면 GET
명령어를 사용합니다.
:6379> GET hello::bob Hello bob!
exit
명령어를 사용하여 종료합니다.
8. 삭제
삭제하려면 Cloud Shell에서 Compute Engine 및 Memorystore 인스턴스를 삭제하세요.
컴퓨팅 인스턴스를 삭제합니다.
$ gcloud compute instances delete instance-1 --zone us-central1-c
Redis용 Memorystore 인스턴스를 삭제합니다.
$ gcloud redis instances delete myinstance --region=us-central1
9. 축하합니다.
Redis용 Memorystore와 Compute Engine 인스턴스를 만들었습니다. 또한 Spring Boot 캐싱과 함께 Memorystore를 사용하도록 Spring Boot 앱을 구성했습니다.
자세히 알아보기
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.