[Spring/Redis] Redis문서 정리(Object Mapping & Redis Repository)

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

이번 문서는 객체 매핑 및 Redis 레포지터리 사용법입니다.

https://redis.io/learn/develop/java/redis-and-spring-course/lesson_3

객체 매핑 및 Redis 리포지토리

저자: Brian Sam-Bodden, Redis 개발자 옹호자

목표

RedisTemplate을 구성하고 Spring REST 컨트롤러에서 Redis로 데이터를 읽고 쓰기 위한 다양한 연산 번들을 접근하는 방법을 배웁니다.

학습 내용

  • @RedisHash 주석을 사용하여 도메인 객체를 매핑하는 방법
  • @Id를 사용하여 매핑된 객체에 기본 키를 제공하는 방법
  • @Reference를 사용하여 객체 간의 참조 관계를 만드는 방법
  • Redis 리포지토리를 생성하고 도메인 객체를 저장하는 방법

문제 발생 시:

  • 이 레슨의 진행 상황은 redi2read GitHub 저장소에서 확인할 수 있습니다.

사용자와 역할

Redi2Read에서 사용자는 하나 이상의 역할(Role)을 가지며, 이는 일반적인 일대다 관계입니다.

@RedisHash 사용하기

이 섹션에서는 Redi2Read 도메인 모델을 생성합니다. Lombok을 사용하여 POJO를 단순화하고, Spring Data Redis의 @RedisHash 및 기타 주석을 사용하여 모델을 Redis에 저장하도록 구성합니다.

역할 모델

먼저 가장 간단한 도메인 클래스인 Role 클래스를 생성합니다. 파일 이름을 Role.java로 하고 다음 내용을 추가합니다:

package com.redislabs.edu.redi2read.models;

import lombok.Data;

@Data
public class Role {
  private String id;
  private String name;
}

Lombok의 @Data 주석을 사용하여 POJO를 간단하게 만듭니다. Spring Data 리포지토리가 Role 인스턴스를 Redis 해시로 매핑하는 방법을 알 수 있도록 @RedisHash 주석을 클래스에 추가합니다:

package com.redislabs.edu.redi2read.models;

import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

import lombok.Data;

@Data
@RedisHash
public class Role {
  @Id
  private String id;
  private String name;
}

@RedisHash 주석은 timeToLive(Long 타입) 및 기본 Redis 키 접두사를 재정의하는 값을 매개변수로 가질 수 있습니다. id 필드는 @Id 주석으로 표시하여 Spring Data Redis가 적절한 id를 자동 생성하게 합니다.

사용자 모델

User 모델은 회원가입 메서드에서 사용됩니다. 서버 측 유효성 검사를 수행하기 위해 spring-boot-starter-validation 라이브러리에 대한 의존성을 Maven POM에 추가합니다:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

이제 User 클래스를 다음 내용으로 생성합니다:

package com.redislabs.edu.redi2read.models;

import java.util.HashSet;
import java.util.Set;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Reference;
import org.springframework.data.annotation.Transient;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@ToString(onlyExplicitlyIncluded = true)
@Data
@RedisHash
public class User {
  @Id
  @ToString.Include
  private String id;

  @NotNull
  @Size(min = 2, max = 48)
  @ToString.Include
  private String name;

  @NotNull
  @Email
  @EqualsAndHashCode.Include
  @ToString.Include
  @Indexed
  private String email;

  @NotNull
  private String password;

  @Transient
  private String passwordConfirm;

  @Reference
  private Set<Role> roles = new HashSet<Role>();

  public void addRole(Role role) {
    roles.add(role);
  }
}

설명

  1. POJO(@Data)를 Redis 해시(@RedisHash)로 저장할 수 있습니다.
  2. equals/hashcode/toString에 필드를 명시적으로 추가하도록 @EqualsHashCode.Include와 @ToString.Include 주석을 사용합니다.
  3. @Id를 사용하여 자동 생성되는 String Redis 해시 키를 만듭니다.
  4. 이메일 필드에 @Indexed 주석을 추가하여 보조 인덱스를 생성합니다.
  5. javax.validation.constraints 주석을 사용하여 필드를 @Email, @NotNull, @Size로 지정합니다.
  6. passwordConfirm 필드는 @Transient로 표시하여 @RedisHash가 이를 데이터베이스에 직렬화하지 않도록 합니다.
  7. 사용자의 역할은 @Reference로 표시된 Role 객체의 Set으로 저장됩니다.
  8. Role Set에 역할을 추가하는 유틸리티 메서드를 추가합니다.

Spring 리포지토리

두 개의 모델이 올바르게 주석 처리되었으므로 해당 모델에서 데이터 작업을 수행할 리포지토리를 생성합니다.

역할 리포지토리

RoleRepository 인터페이스를 생성합니다:

package com.redislabs.edu.redi2read.repositories;

import com.redislabs.edu.redi2read.models.Role;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface RoleRepository extends CrudRepository<Role, String> {
}

이 리포지토리는 Role 클래스와 키 유형으로 String을 사용하는 CrudRepository를 확장하여 기본적인 CRUD 및 finder 작업을 제공합니다.

역할 리포지토리 테스트

CommandLineRunner 구현을 사용하여 RoleRepository를 테스트합니다. CommandLineRunner는 Spring 컨테이너가 시작될 때 실행할 run 메서드를 구현하는 인터페이스입니다.

CreateRoles 클래스를 생성합니다:

package com.redislabs.edu.redi2read.boot;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
public class CreateRoles implements CommandLineRunner {

 @Override
 public void run(String... args) throws Exception {
   System.out.println(">>> Hello from the CreateRoles CommandLineRunner...");
 }
}

이제 CreateRoles 구성 요소가 실행되는지 확인한 후, 이를 RoleRepository와 함께 작업하도록 완성합니다:

package com.redislabs.edu.redi2read.boot;

import com.redislabs.edu.redi2read.models.Role;
import com.redislabs.edu.redi2read.repositories.RoleRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@Order(1)
@Slf4j
public class CreateRoles implements CommandLineRunner {

  @Autowired
  private RoleRepository roleRepository;

  @Override
  public void run(String... args) throws Exception {
    if (roleRepository.count() == 0) {
      Role adminRole = Role.builder().name("admin").build();
      Role customerRole = Role.builder().name("customer").build();
      roleRepository.save(adminRole);
      roleRepository.save(customerRole);
      log.info(">>>> Created admin and customer roles...");
    }
  }
}

서버 시작 시 CreateRoles 클래스가 실행되고, RoleRepository에 역할이 없는 경우에만 "admin"과 "customer" 역할을 생성하고 Redis에 저장합니다.

Redis CLI를 사용하여 저장된 역할을 확인할 수 있습니다:

127.0.0.1:6379> KEYS com.redislabs.edu.redi2read.models.Role*
1) "com.redislabs.edu.redi2read.models.Role:c4219654-0b79-4ee6-b928-cb75909c4464"
2) "com.redislabs.edu.redi2read.models.Role:9d383baf-35a0-4d20-8296-eedc4bea134a"
3) "com.redislabs.edu.redi2read.models.Role"

127.0.0.1:6379> TYPE "com.redislabs.edu.redi2read.models.Role:c4219654-0b79-4ee6-b928-cb75909c4464"
hash

127.0.0.1:6379> HGETALL "com.redislabs.edu.redi2read.models.Role:c4219654-0b79-4ee6-b928-cb75909c4464"
1) "_class"
2) "com.redislabs.edu.redi2read.models.Role"
3) "id"
4) "c4219654-0b79-4ee6-b928-cb75909c4464"
5) "name"
6) "admin"

127.0.0.1:6379> TYPE "com.redislabs.edu.redi2read.models.Role"
set

127.0.0.1:6379> SMEMBERS "com.redislabs.edu.redi2read.models.Role"
1) "9d383baf-35a0-4d20-8296-eedc4bea134a"
2) "c4219654-0b79-4ee6-b928-cb75909c4464"

이렇게 해서 Spring Data Redis를 사용하여 객체 매핑과 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문서정리(Redis Spring 시작하기)  (0) 2024.06.11
[Spring/Redis] Redis문서정리(Redis OM -Spring실습 -Hash)  (0) 2024.06.11
[Spring/Redis] Redis 문서 정리(Redis OM -Spring 소개)  (0) 2024.06.11
'Redis/Redis 개념' 카테고리의 다른 글
  • [Spring/Redis] Redis 문서 정리(Search With Redis)
  • [Spring/Redis] Redis 문서 정리(User Roles, Secondary Indexes)
  • [Spring/Redis] Redis문서정리(Redis Spring 시작하기)
  • [Spring/Redis] Redis문서정리(Redis OM -Spring실습 -Hash)
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • 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)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [Spring/Redis] Redis문서 정리(Object Mapping & Redis Repository)
    상단으로

    티스토리툴바