Memorystore로 Spring Boot 앱의 데이터 캐시하기

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"></ph> 읽기 전용 연습 읽기 및 완료하기

귀하의 Google Cloud 서비스 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 설정 및 요구사항

자습형 환경 설정

  1. Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

  1. 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.

이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ를 클릭합니다.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

이전에 Cloud Shell을 시작하지 않았으면 설명이 포함된 중간 화면(스크롤해야 볼 수 있는 부분)이 제공됩니다. 이 경우 계속을 클릭합니다(이후 다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

가상 머신은 필요한 모든 개발 도구와 함께 로드됩니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.

  1. 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 인스턴스가 '준비됨' 상태여야 합니다. 상태 :

ee90b43f15a6dc1f.png

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를 클릭합니다.

a87bd437a0c8c7b4.png

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 일반 라이선스에 따라 사용이 허가되었습니다.