이 Codelab 정보
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은 어떻게 사용할 계획인가요?
Google Cloud 서비스 사용 만족도를 평가해 주세요.
2. 설정 및 요구사항
자습형 환경 설정
Google 계정 (Gmail 또는 Google 앱)이 아직 없다면 계정을 만들어야 합니다. Google Cloud Platform Console (console.cloud.google.com)에 로그인하여 새 프로젝트를 만듭니다.
모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID
라고 부릅니다.
다음으로 Google Cloud 리소스를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다.
이 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].
3. Redis용 Memorystore 인스턴스 설정
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 Console에서 Storage > Memorystore로 이동하면 인스턴스가 '준비' 상태인 것을 확인할 수 있습니다.
4. Compute Engine 인스턴스 설정
같은 리전에 Compute Engine 인스턴스를 생성합니다.
$ gcloud compute instances create instance-1 --zone us-central1-c
작업이 완료되면 인스턴스를 사용할 수 있습니다.
Compute >, Compute Engine >, VM 인스턴스로 이동하여 SSH를 통해 인스턴스에 연결하고 연결 열에서 SSH를 클릭합니다.
Cloud Shell이 아닌 가상 머신(VM) 인스턴스 셸에 OpenJDK, Maven, telnet을 설치합니다.
$ sudo apt-get install openjdk-8-jdk-headless maven telnet
설치가 완료될 때까지 기다린 후 다음 단계로 진행합니다.
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 \ | 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 컨트롤러 자바 클래스를 만듭니다.
$ 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. 앱 실행 및 엔드포인트 액세스
이제 앱을 실행할 준비가 되었습니다.
$ 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. 캐시된 객체 검토
실제로 앱이 캐시한 내용을 정확히 볼 수 있습니다. 이전 단계에서 사용한 것과 동일한 터미널에서 telnet을 사용하여 Redis용 Memorystore 호스트에 연결합니다.
$ telnet <memorystore-host-ip-address> 6379
캐시 키 목록을 보려면 다음 명령어를 사용합니다.
KEYS * hello::bob
보시다시피 캐시 이름은 키의 프리픽스로 사용되고 매개변수 값은 두 번째 부분으로 사용됩니다.
값을 검색하려면 GET
명령어를 사용합니다.
$ GET hello::bob Hello bob!
종료하려면 QUIT
명령어를 사용합니다.
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 앱을 구성했습니다.
자세히 알아보기
- Spring Boot 캐싱
- Memorystore
- Google Cloud 프로젝트의 Spring
- Google Cloud GitHub 저장소의 Spring
- Google Cloud의 자바
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.