
spring 프로젝트 생성 후 application.yml 설정
spring:
data:
redis:
host: <서버 주소>
port: <포트 번호>
username: <사용자 계정, 기본값 default>
password: <사용자 비밀번호>
host와 port를 작성하지 않으면 localhost:6379에 연결을 시도
일반적인 CRUD작업을 하며, spring-boot-starter-data-redis 의존성이 추가되어 있다면, Java 객체를 Redis에 손쉽게 CRUD 할 수 있음.
Item.java
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
// Entity대신 RedisHash
@RedisHash("item")
public class Item implements Serializable {
@Id
// Id를 String으로 쓰면 UUID자동으로 배정
private String id;
private String name;
private String description;
private Integer price;
}
JPA와 비슷하지만 @Entity 대신 @RedisHash사용
ItemRepository.java
public interface ItemRepository extends CrudRepository<Item, String> {}
특별히 메서드를 선언하지 않아도 기본적인 CRUD 작업을 하고, 이를 사용하면 Redis에 Hash 자료형으로 데이터를 저장
create 테스트
@Autowired
private ItemRepository itemRepository;
@Test
public void createTest(){
//객체를 만들고
Item item = Item.builder()
.name("keyboard")
.description("Very Expensive Keyboard")
.price(100000)
.build();
// save 호출
itemRepository.save(item);
}

UUID로 KEY생성 & Item객체 Hash 테이블에 저장.
readOneTest(), updateTest(), deleteTest()
@Test
public void readOneTest(){
Item item = itemRepository.findById("a7ee0058-0a6f-41e8-97f5-96dee32ecacb").orElseThrow();
System.out.println("item = " + item.getDescription());
}
@Test
public void updateTest(){
Item item = itemRepository.findById("a7ee0058-0a6f-41e8-97f5-96dee32ecacb").orElseThrow();
item.setDescription("new description");
Item save = itemRepository.save(item);
System.out.println(save.getDescription());
}
@Test
public void deleteTest(){
itemRepository.deleteById("a7ee0058-0a6f-41e8-97f5-96dee32ecacb");
}
Repository보다 정교한 작업
Key와 자료형을 직접 설정 가능.
RedisTemplate를 정의하며 Key와 Value로 사용될 Java클래스를 정하고, 이 후 RedisPerations를 이용해 작업.
복잡한 작업 없이 Java의 문자열만 다루는 경우, StringRedisTemplate가 기본적으로 생성.
Key와 Value 모두 Java의 문자열이라고 가정.
문자열 데이터를 주고받기 위한 작업들을 준비하며, 기본 설정을 가지고 자동으로 만들어져 주입되는 Spring Bean입니다.
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void StirngOpsTest(){
// 지금 RedisTemplate에 설정된 타입을 바탕으로
// Redis 문자열 조작을 한다.
// ValueOperations : 문자열 조작을 위한 클래스
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
ops.set("simplekey", "simplevalue");
System.out.println(ops.get("simplekey"));
}

String뿐만 아니라 set타입도 활용 가능
@Test
public void stringSetOpsTest() {
// SetOperations : 집합을 조작하기 위한 클래스
SetOperations<String, String> setOps = stringRedisTemplate.opsForSet();
setOps.add("hobbies", "games");
setOps.add("hobbies", "coding");
setOps.add("hobbies", "alcohol");
setOps.add("hobbies", "games");
System.out.println(setOps.size("hobbies"));
}

| 인터페이스 | 메서드 | 설명 |
|---|---|---|
<HK,HV> HashOperations<K,HK,HV> | opsForHash() | 해시(Hash) 값을 다루는 작업 수행 |
ValueOperations<K,V> | opsForValue() | 단순 값(String 등)을 다루는 작업 수행 |
ListOperations<K,V> | opsForList() | 리스트(List) 값을 다루는 작업 수행 |
SetOperations<K,V> | opsForSet() | 집합(Set) 값을 다루는 작업 수행 |
ZSetOperations<K,V> | opsForZSet() | 정렬된 집합(ZSet, Sorted Set) 값을 다루는 작업 수행 |
@Configuration에서 RedisTemplate 정의하기ItemDto.java
@Getter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ItemDto implements Serializable {
private String name;
private String description;
private Integer price;
}
RedisConfig.java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, ItemDto> itemDtoRedisTemplate(
//application.yml에 넣은 정보를 바탕을 생성
RedisConnectionFactory connectionFactory
){
RedisTemplate<String, ItemDto> template = new RedisTemplate<>(); // 1
template.setConnectionFactory(connectionFactory); //2
// key를 Redis에 넘겨줄때 직렬화와 역직렬화를 어떻게 할지
template.setKeySerializer(RedisSerializer.string()); // 3-a
template.setValueSerializer(RedisSerializer.json()); // 3-b
return template; // 4
}
}
RedisTemplate을 만들면서, 타입 파라미터를 String, ItemDto로 설정. 이는 Key는 Java의 String, Value는 저희의 ItemDto를 사용해 Redis와 소통한다는 의미.RedisConnectionFactory를 template에 전달. 이때, RedisConnectionFactory의 경우 applcation.yaml 파일의 내용을 바탕으로 내부적으로 만들어 Bean 객체로 등록됩니다.a. Key는 문자열로 직렬화, 역직렬화를 진행합니다.
b. Value는 데이터를 JSON으로 직렬화 합니다.
이 과정은 필수는 아니지만, Redis 상의 데이터를 저희가 좀더 읽기 쉽게 하기 위함입니다.
template을 반환하면 Bean 객체로 등록. @Autowired
private RedisTemplate<String, ItemDto> itemRedisTemplate;
@Test
public void itemRedisTemplateTest(){
ValueOperations<String, ItemDto> ops = itemRedisTemplate.opsForValue();
ops.set("my:keyboard", ItemDto.builder()
.name("Mechanical keyboard")
.price(250000)
.description("OMG")
.build());
System.out.println(ops.get("my:keyboard"));
ops.set("my:mouse",ItemDto.builder()
.name("mouce mice")
.price(100000)
.description("OMG")
.build());
System.out.println(ops.get("my:mouse"));
}