이번 문서는 객체 매핑 및 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);
}
}
설명
- POJO(@Data)를 Redis 해시(@RedisHash)로 저장할 수 있습니다.
- equals/hashcode/toString에 필드를 명시적으로 추가하도록 @EqualsHashCode.Include와 @ToString.Include 주석을 사용합니다.
- @Id를 사용하여 자동 생성되는 String Redis 해시 키를 만듭니다.
- 이메일 필드에 @Indexed 주석을 추가하여 보조 인덱스를 생성합니다.
- javax.validation.constraints 주석을 사용하여 필드를 @Email, @NotNull, @Size로 지정합니다.
- passwordConfirm 필드는 @Transient로 표시하여 @RedisHash가 이를 데이터베이스에 직렬화하지 않도록 합니다.
- 사용자의 역할은 @Reference로 표시된 Role 객체의 Set으로 저장됩니다.
- 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 리포지토리를 구성하고 사용하는 방법을 배
웠습니다.
'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 |