[Spring/Redis] Redis문서정리(Redis OM -Spring실습 -Hash)

2024. 6. 11. 16:56·Redis/Redis 개념
728x90
반응형
SMALL

자바 객체의 해시 매핑 향상

소개

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 파일을 다운로드하십시오. 이 프로젝트는 튜토리얼의 예제에 맞게 구성되어 있습니다.

  1. Spring Initializr로 이동합니다. 이 서비스는 애플리케이션에 필요한 모든 종속성을 가져오고 대부분의 설정을 수행합니다.
  2. Gradle 또는 Maven과 사용하려는 언어를 선택합니다. 이 가이드에서는 Java를 선택했다고 가정합니다.
  3. 웹(Web)과 Lombok, Spring Boot DevTools를 선택합니다.
  4. 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를 통합하는 방법을 배울 수 있습니다.

728x90
반응형
SMALL

'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
'Redis/Redis 개념' 카테고리의 다른 글
  • [Spring/Redis] Redis 문서 정리(User Roles, Secondary Indexes)
  • [Spring/Redis] Redis문서 정리(Object Mapping & Redis Repository)
  • [Spring/Redis] Redis문서정리(Redis Spring 시작하기)
  • [Spring/Redis] Redis 문서 정리(Redis OM -Spring 소개)
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (315)
      • 면접 준비 (36)
        • OS (6)
        • Spring Security (0)
        • Java (2)
        • DB (9)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Springframework
      자바 면접
      스프링프레임워크
      Spring
      JS
      백준
      자바 반복문
      redis
      Til
      Spring Data Redis
      JSP
      springsecurity
      자바
      레디스
      CSS
      프로그래머스
      리눅스마스터2급정리
      JavaScript
      java
      리눅스마스터2급
      jsp기초
      HTML
      자바기초
      jsp request
      자바스크립트
      redis 채팅
      자바 알고리즘
      자바 면접질문
      리눅스
      spring redis
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [Spring/Redis] Redis문서정리(Redis OM -Spring실습 -Hash)
    상단으로

    티스토리툴바