자바 객체의 해시 매핑 향상
소개
Spring Data Redis(SDR) 프레임워크는 Spring 애플리케이션이 Redis를 Java 객체(POJO)의 저장소로 쉽게 사용할 수 있도록 하여 상호작용에 필요한 반복 작업과 보일러플레이트 코드를 제거합니다.
Redis OM Spring은 SDR 위에 구축되어 Redis의 풍부한 모듈 생태계를 활용하여 Redis와의 상호작용을 개선하고 최적화합니다. SDR의 @RedisHash
주석으로 매핑된 Java 객체에 대해 다음과 같은 방식으로 객체 매핑을 강화합니다:
- 클라이언트 측에서 유지 관리하는 보조 인덱스를 제거하고 Redis의 네이티브 검색 및 쿼리 엔진을 사용
- 동적 리포지토리 파인더를 구현하여 빠르고 유연한 쿼리 지원
- 성능, 가독성 및 상호 운용성을 위해 전통적인 UUID 대신 ULID 사용
구축할 내용
User POJO(Plain Old Java Objects)를 Redis 해시로 저장하는 애플리케이션을 구축할 것입니다.
필요한 준비물
- 약 15분
- 좋아하는 텍스트 에디터 또는 IDE
- JDK 11 이상
- Gradle 4+ 또는 Maven 3.2+
- Docker / Docker Compose
Spring Initializr로 시작하기
Spring Initializr를 사용하여 기본 SpringBoot 애플리케이션을 생성합니다. 이 미리 초기화된 프로젝트를 사용하여 ZIP 파일을 다운로드하십시오. 이 프로젝트는 튜토리얼의 예제에 맞게 구성되어 있습니다.
- Spring Initializr로 이동합니다. 이 서비스는 애플리케이션에 필요한 모든 종속성을 가져오고 대부분의 설정을 수행합니다.
- Gradle 또는 Maven과 사용하려는 언어를 선택합니다. 이 가이드에서는 Java를 선택했다고 가정합니다.
웹(Web)
과Lombok
,Spring Boot DevTools
를 선택합니다.- Generate를 클릭하여 ZIP 파일(roms-hashes.zip)을 다운로드합니다. 이 파일은 선택한 구성으로 웹 애플리케이션을 포함한 아카이브입니다.
Redis OM Spring 추가하기
Maven을 사용하는 경우, pom.xml
파일에 다음 종속성을 추가합니다:
<dependency>
<groupId>com.redis.om</groupId>
<artifactId>redis-om-spring</artifactId>
<version>0.5.2-SNAPSHOT</version>
</dependency>
Gradle을 사용하는 경우, build.gradle
파일에 다음 종속성을 추가합니다:
dependencies {
implementation 'com.redis.om.spring:redis-om-spring:0.1.0-SNAPSHOT'
}
Redis 리포지토리 활성화하기
생성된 애플리케이션에는 단일 Java 파일, @SpringBootApplication
으로 주석이 달린 메인 애플리케이션이 포함되어 있습니다. Spring Data Redis 리포지토리를 활성화하려면 메인 또는 구성 클래스에 @EnableRedisEnhancedRepositories
와 @Configuration
주석을 추가해야 합니다.
package com.redis.om;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.redis.om.spring.annotations.EnableRedisEnhancedRepositories;
@SpringBootApplication
@EnableRedisEnhancedRepositories(basePackages = "com.redis.om.hashes.*")
public class RomsHashesApplication {
public static void main(String[] args) {
SpringApplication.run(RomsHashesApplication.class, args);
}
}
Redis 시작하기
Redis OM Spring은 Redis Stack의 강력함에 의존합니다. 아래의 Docker Compose YAML 파일을 사용하여 빠르게 시작할 수 있습니다. 이 파일을 프로젝트의 루트 폴더에 docker-compose.yml
로 저장하십시오.
version: '3.9'
services:
redis:
image: 'redis/redis-stack:latest'
ports:
- '6379:6379'
volumes:
- ./data:/data
environment:
- REDIS_ARGS: --save 20 1
deploy:
replicas: 1
restart_policy:
condition: on-failure
Docker Compose 애플리케이션을 시작하려면 명령줄에서 다음 명령을 실행합니다:
docker compose up
또한 Redis CLI 인스턴스를 시작하여 ROMS의 작업을 모니터링할 수 있습니다:
redis-cli MONITOR
도메인 엔티티
애플리케이션에는 User
클래스가 포함됩니다. Lombok을 사용하여 게터와 세터를 생성할 필요가 없습니다. Lombok 주석 @Data
, @RequiredArgsConstructor
, @AllArgsConstructor
, @NoArgsConstructor
를 사용합니다. 마지막으로, 클래스가 JSON 문서임을 나타내기 위해 @RedisHash
주석을 사용합니다.
package com.redis.om.hashes.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Data
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor
@RedisHash
public class User {
@Id
private String id;
@Indexed @NonNull
private String firstName;
@Indexed
private String middleName;
@Indexed @NonNull
private String lastName;
@NonNull
@Indexed
private String email;
}
User
클래스는 firstName
, middleName
, lastName
및 email
속성을 가집니다.
Redis OM Spring 문서 리포지토리
UserRepository
를 다음과 같이 생성합니다:
package com.redis.om.hashes.repositories;
import java.util.List;
import java.util.Optional;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.redis.om.hashes.domain.User;
@Repository
public interface UserRepository extends CrudRepository<User, String> {
}
데이터베이스 미리 채우기
애플리케이션 시작 시 몇 개의 User
POJO를 Redis에 추가합니다. RomsHashesApplication
클래스에 UserRepository
를 추가하고, CommandLineRunner
를 사용하여 네 개의 User
POJO를 생성하고 데이터베이스에 저장합니다.
package com.redis.om.hashes;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.redis.om.hashes.domain.User;
import com.redis.om.hashes.repositories.UserRepository;
import com.redis.om.spring.annotations.EnableRedisEnhancedRepositories;
@SpringBootApplication
@Configuration
@EnableRedisEnhancedRepositories(basePackages = "com.redis.om.hashes.*")
public class RomsHashesApplication {
@Autowired
private UserRepository userRepo;
@Bean
CommandLineRunner loadTestData() {
return args -> {
userRepo.deleteAll();
User john = User.of("Zack", "de la Rocha", "zack@ratm.com");
User tim = User.of("Tim", "Commerford", "tim@ratm.com");
User tom = User.of("Tom", "Morello", "tom@ratm.com");
User brad = User.of("Brad", "Wilk", "brad@ratm.com");
userRepo.saveAll(List.of(john, tim, tom, brad));
};
}
public static void main(String[] args) {
SpringApplication.run(RomsHashesApplication.class, args);
}
}
애플리케이션이 실행 중이라면 재시작되었을 것입니다. 그렇지 않다면 mvn
명령을 사용하여 애플리케이션을 시작합니다:
./mvnw spring-boot:run
데이터 확인
Redis CLI를 사용하여 키를 확인합니다:
redis-cli
127.0.0.1:6379> SCAN 0 MATCH com.redis.om.hashes.domain.User*
간단한 동적 쿼리 생성
UserRepository
에 간단한 메서드를 추가하여 성으로 사용자를 찾습니다:
package com.redis.om.hashes.repositories;
import java.util.Optional;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.redis.om.hashes.domain.User;
@Repository
public interface UserRepository extends CrudRepository<User, String> {
Optional<User> findOneByLastName(String lastName);
}
테스트 컨트롤러
REST 컨트롤러를 생성하여 findOneByLastName
메서드를 테스트합니다:
package com.redis.om.hashes.controllers;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.redis.om.hashes.domain.User;
import com.redis.om.hashes.repositories.UserRepository;
@RestController
@RequestMapping("/api/users")
public class User
Controller {
@Autowired
private UserRepository userRepository;
@GetMapping("name/{lastName}")
Optional<User> byName(@PathVariable("lastName") String lastName) {
return userRepository.findOneByLastName(lastName);
}
}
CURL을 사용하여 엔드포인트를 테스트합니다:
curl --location --request GET 'http://localhost:8080/api/users/name/Morello'
사용자 지정 쿼리
UserRepository
에 복합 쿼리를 추가합니다:
List<User> findByFirstNameAndLastName(String firstName, String lastName);
컨트롤러에 추가하여 테스트합니다:
@GetMapping("/q")
public List<User> findByName(@RequestParam String firstName, @RequestParam String lastName) {
return userRepository.findByFirstNameAndLastName(firstName, lastName);
}
CURL을 사용하여 테스트합니다:
curl --location --request GET 'http://localhost:8080/api/users/q?firstName=Brad&lastName=Wilk'
이 튜토리얼을 통해 Redis OM Spring의 기본 개념과 주요 기능을 이해하고, Spring Boot 애플리케이션에 Redis를 통합하는 방법을 배울 수 있습니다.
'Redis > Redis 개념' 카테고리의 다른 글
[Spring/Redis] Redis 문서 정리(Search With Redis) (0) | 2024.06.11 |
---|---|
[Spring/Redis] Redis 문서 정리(User Roles, Secondary Indexes) (0) | 2024.06.11 |
[Spring/Redis] Redis문서 정리(Object Mapping & Redis Repository) (0) | 2024.06.11 |
[Spring/Redis] Redis문서정리(Redis Spring 시작하기) (0) | 2024.06.11 |
[Spring/Redis] Redis 문서 정리(Redis OM -Spring 소개) (0) | 2024.06.11 |