spring-boot
MongoDB 용 Spring 부팅을 이용한 Redis로 캐싱
수색…
왜 캐싱인가?
오늘날 성능은 웹 서비스 / 응용 프로그램을 개발할 때 평가해야 할 가장 중요한 지표 중 하나입니다. 고객의 참여를 유지하는 것은 모든 제품에 중요하며, 이러한 이유로 성능을 향상시키고 페이지로드 시간을 줄이는 것이 매우 중요합니다.
데이터베이스와 상호 작용하는 웹 서버를 실행할 때 작업이 병목 현상이 될 수 있습니다. MongoDB도 여기 예외는 아니며 MongoDB 데이터베이스가 확장됨에 따라 상황이 실제로 느려질 수 있습니다. 데이터베이스 서버가 웹 서버에서 분리되면이 문제는 더욱 심각해질 수 있습니다. 이러한 시스템에서 데이터베이스와의 통신은 큰 오버 헤드를 초래할 수 있습니다.
다행히도, 우리는 일을 빠르게하기 위해 캐싱이라는 방법을 사용할 수 있습니다. 이 예제에서는이 메소드를 사용하여 스프링 캐시, 스프링 데이터 및 Redis를 사용하여 애플리케이션의 성능을 향상시키는 방법을 설명합니다.
기본 시스템
첫 번째 단계로서 MongoDB에 데이터를 저장하는 기본 웹 서버를 구축 할 것입니다. 이 데모에서는 "빠른 라이브러리"라고 이름을 지정합니다. 서버에는 두 가지 기본 작업이 있습니다.
POST /book
:이 엔드 포인트는 POST /book
의 제목, 작성자 및 내용을 수신하고 데이터베이스에 책 항목을 작성합니다.
GET /book/ {title}
:이 엔드 포인트는 제목을 얻고 그 내용을 반환합니다. 제목은 책을 고유하게 식별한다고 가정합니다 (따라서 동일한 제목의 도서는 두 장이 없습니다). 물론 더 나은 대안은 ID를 사용하는 것입니다. 그러나 간단하게하기 위해 제목을 사용합니다.
이것은 간단한 라이브러리 시스템이지만, 우리는 나중에 고급 능력을 추가 할 것입니다.
이제 Spring Tool Suite (Eclipse를 사용하여 빌드) 및 Spring Starter Project를 사용하여 프로젝트를 생성 해 보겠습니다.
우리는 Java를 사용하여 프로젝트를 구축하고 build하기 위해 maven을 사용하고, 값을 선택하고 다음을 클릭합니다.
웹 모듈에서 NOSQL 및 Web의 MongoDB, Redis를 선택하고 마침을 클릭하십시오. 우리는 Setters의 자동 생성 및 모델 값의 getter를 위해 Lombok을 사용하므로 POM에 Lombok 종속성을 추가해야합니다.
MongoDbRedisCacheApplication.java에는 Spring Boot Application을 실행하는 데 사용되는 main 메소드가 포함되어 있습니다.
id, 책 제목, 저자, 설명 및 @Data로 주석을 달아 모델 클래스를 작성하여 jar 프로젝트에서 자동 setter 및 getter 생성 lombok
package com.example;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import lombok.Data;
@Data
public class Book {
@Id
private String id;
@Indexed
private String title;
private String author;
private String description;
}
Spring Data는 우리에게 기본적으로 모든 CRUD 연산을 자동으로 생성하므로 BookRepository.Java를 생성하여 제목으로 책을 찾고 책을 삭제합니다
package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository extends MongoRepository<Book, String>
{
Book findByTitle(String title);
void delete(String title);
}
데이터를 MongoDB에 저장하고 idTitle (@PathVariable String title)에 의해 데이터를 검색하는 webservicesController를 생성 해보자.
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebServicesController {
@Autowired
BookRepository repository;
@Autowired
MongoTemplate mongoTemplate;
@RequestMapping(value = "/book", method = RequestMethod.POST)
public Book saveBook(Book book)
{
return repository.save(book);
}
@RequestMapping(value = "/book/{title}", method = RequestMethod.GET)
public Book findBookByTitle(@PathVariable String title)
{
Book insertedBook = repository.findByTitle(title);
return insertedBook;
}
}
캐시 추가하기 지금까지는 기본적인 라이브러리 웹 서비스를 만들었지 만, 그다지 빠르지는 않습니다. 이 절에서는 결과를 캐싱하여 findBookByTitle () 메서드를 최적화하려고 시도합니다.
이 목표를 달성하는 방법에 대해 더 잘 이해하려면 전통적인 도서관에 앉아있는 사람들의 사례로 돌아가 보겠습니다. 그들이 특정 제목의 책을 찾고 싶다고합시다. 우선, 그들은 테이블을 둘러보고 이미 가져 왔는지 확인합니다. 그들이 가지고 있다면, 대단하다! 그들은 캐시에서 항목을 찾는 캐시 히트를 가졌습니다. 캐시를 찾지 못하면 캐시 미스가 발생하여 캐시에서 해당 항목을 찾지 못했습니다. 누락 된 품목의 경우 도서관에서 책을 찾아야합니다. 그들이 그것을 발견하면, 테이블에 보관하거나 캐시에 삽입합니다.
이 예제에서는 findBookByTitle () 메서드에 대해 정확히 동일한 알고리즘을 사용합니다. 특정 제목의 도서를 요청하면 캐시에서 찾을 것입니다. 발견되지 않으면, 우리는 주 기억 장치, 즉 우리의 MongoDB 데이터베이스에서 찾을 것입니다.
Redis 사용
클래스 경로에 spring-boot-data-redis를 추가하면 스프링 부트가 마법을 수행 할 수 있습니다. 자동 구성으로 필요한 모든 작업을 생성합니다.
이제 캐쉬에 아래 라인이있는 메소드에 주석을 달고 스프링 부트가 마술을하도록 해보자.
@Cacheable (value = "book", key = "#title")
레코드가 삭제 될 때 캐시에서 삭제하려면 BookRepository에서 아래 줄에 주석을 달고 Spring Boot가 캐시 삭제를 처리하게하십시오.
@CacheEvict (value = "book", key = "#title")
데이터를 업데이트하려면 메소드에 아래 줄을 추가하고 스프링 부트 핸들을 처리하도록합니다.
@CachePut(value = "book", key = "#title")
GitHub 에서 전체 프로젝트 코드를 찾을 수 있습니다.