Redis용 Memorystore는 Google Cloud를 위한 완전 관리형 Redis 서비스입니다. Google Cloud에서 실행되는 앱은 복잡한 Redis 배포를 관리할 필요 없이 확장성, 가용성, 안전성이 뛰어난 Redis 서비스를 활용하여 성능을 극대화할 수 있습니다. 데이터 캐싱의 백엔드로 사용하여 Spring Boot 앱의 성능을 개선할 수 있습니다. Codelab에서는 설정 방법을 설명합니다.
학습할 내용
- Memorystore를 Spring Boot 앱의 캐시 백엔드로 사용하는 방법
필요한 항목
- Google Cloud 프로젝트
- 브라우저(예: Chrome)
- Vim, Emacs, GNU Nano 등의 표준 Linux 텍스트 편집기에 관한 기본 지식
이 Codelab을 어떻게 사용할 예정인가요?
Google Cloud 서비스 사용 경험을 평가해 주세요.
자습형 환경 설정
아직 Google 계정 (Gmail 또는 Google Apps)이 없으면 계정을 만들어야 합니다. Google Cloud Platform 콘솔 (console.cloud.google.com)에 로그인하고 새 프로젝트를 만듭니다.
모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID
라고 부릅니다.
그런 다음 Google Cloud 리소스를 사용할 수 있도록 Cloud 콘솔에서 결제를 사용 설정해야 합니다.
이 codelab을 실행하는 과정에는 많은 비용이 들지 않지만 더 많은 리소스를 사용하려고 하거나 실행 중일 경우 비용이 더 들 수 있습니다(이 문서 마지막의 '삭제' 섹션 참조).
Google Cloud Platform 신규 사용자는 $300 상당의 무료 체험판을 사용할 수 있습니다.
Google Cloud Shell 활성화하기
GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.
그런 다음 'Cloud Shell 시작'을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다.
가상 머신은 필요한 모든 개발 도구와 함께 로드됩니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 실습에서 대부분의 작업은 브라우저나 Google Chromebook만을 이용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 PROJECT_ID로 이미 설정된 것을 확인할 수 있습니다.
Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
Cloud Shell을 시작합니다.
Cloud Shell이 실행되면 명령줄을 사용하여 새 Memorystore 인스턴스를 만들 수 있습니다.
$ gcloud redis instances create myinstance --size=1 --region=us-central1
Memorystore API가 사용 설정되지 않은 경우 사용 설정할지 묻는 메시지가 표시됩니다. y로 답합니다.
API [redis.googleapis.com] not enabled on project [204466653457]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y Enabling service redis.googleapis.com on project 204166153457... Waiting for async operation operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416 to complete... Operation finished successfully. The following command can describe the Operation details: gcloud services operations describe operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416 Create request issued for: [myinstance] Waiting for operation [operation-1538645026454-57763b937ad39-2564ab37-3fea7701] to complete...done. Created instance [myinstance].
작업이 완료되면 인스턴스를 사용할 수 있습니다.
다음 명령어를 실행하여 인스턴스의 redis host ip-address를 가져옵니다. 나중에 Spring Boot 앱을 구성할 때 다시 사용합니다.
$ gcloud redis instances describe myinstance --region=us-central1 \ | grep host host: 10.0.0.4
Google Cloud 콘솔에서 스토리지 > Memorystore로 이동하면 인스턴스가 '준비됨' 상태로 표시됩니다.
동일한 리전에서 Compute Engine 인스턴스를 만듭니다.
$ gcloud compute instances create instance-1 --zone us-central1-c
작업이 완료되면 인스턴스를 사용할 수 있습니다.
컴퓨트 > Compute Engine > VM 인스턴스로 이동하여 SSH를 통해 인스턴스에 연결하고 연결 열에서 SSH를 클릭합니다.
가상 머신 (VM) 인스턴스 셸 (Cloud Shell 아님)에서 OpenJDK, Maven, telnet을 설치합니다.
$ sudo apt-get install openjdk-8-jdk-headless maven telnet
설치가 완료될 때까지 기다린 후 다음 단계로 진행합니다.
web
, redis
, cache
종속 항목을 사용하여 새 Spring Boot 프로젝트를 만듭니다.
$ curl https://start.spring.io/starter.tgz \ -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \ | tar -xzvf - && cd cache-app
application.properties
파일을 수정하여 Redis 호스트의 Memorystore 인스턴스 IP 주소를 사용하도록 앱을 구성합니다.
$ nano src/main/resources/application.properties
Redis용 Memorystore IP 주소 (몇 단계 전)를 사용하여 다음 줄을 추가합니다.
spring.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); } }
이제 앱을 실행할 준비가 되었습니다.
$ 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)
호출이 있음에도 불구하고 다음 요청은 훨씬 빨랐습니다. 실제 메서드가 한 번만 실행되고 결과가 캐시에 저장되었기 때문입니다. 이후의 모든 호출은 캐시에서 직접 결과를 반환합니다.
앱에서 캐시한 내용을 정확히 확인할 수 있습니다. 이전 단계에서 사용한 것과 동일한 터미널에서 텔넷을 사용하여 Redis용 Memorystore 호스트에 연결합니다.
$ telnet <memorystore-host-ip-address> 6379
캐시 키 목록을 확인하려면 다음 명령어를 사용하세요.
KEYS * hello::bob
보시다시피 캐시 이름은 키의 접두사로 사용되고 매개변수 값은 두 번째 부분으로 사용됩니다.
값을 가져오려면 GET
명령어를 사용합니다.
$ GET hello::bob Hello bob!
QUIT
명령어를 사용하여 종료합니다.
삭제하려면 Cloud Shell에서 Compute Engine 및 Memorystore 인스턴스를 삭제하세요.
컴퓨팅 인스턴스를 삭제합니다.
$ gcloud compute instances delete instance-1 --zone us-central1-c
Memorystore for Redis 인스턴스를 삭제합니다.
$ gcloud redis instances delete myinstance --region=us-central1
Redis용 Memorystore 및 Compute Engine 인스턴스를 만들었습니다. 또한 Spring Boot 캐싱과 함께 Memorystore를 사용하도록 Spring Boot 앱을 구성했습니다.
자세히 알아보기
- Spring Boot 캐싱
- Memorystore
- Google Cloud의 Spring 프로젝트
- Google Cloud의 Spring GitHub 저장소
- Google Cloud의 Java
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.