이전 글에서는 Redis 자체를 이용하는 방법을 설명했다. docker를 통해 redis 이미지로 설치하고, 인텔리제이에서 redis 를 연결 후 직접 콘솔에서 명령어들을 익혀보았다.
이번에는 SpringBoot 어떻게 Redis 를 활용하는지 살펴보자.
redis 관련 build.gradle
과 application.yml
은 이전 글에서 작성했으니 생략하겠다.
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@RedisHash("item") <-- Hash 로 동작
public class Item {
@Id
private String id; //String 으로 id 타입을 지정하면 UUID 로 자동 저장된다.
private String name;
private String description;
private Integer price;
}
@Getter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ItemDto implements Serializable{
private String name;
private String description;
private Integer price;
}
Item
엔티티를 보면@RedisHash
가 있는데, 이는 엔티티를 redis에 저장할 도메인으로써 사용한다는 뜻"item"
은 hash 키-값 쌍이 담긴 공간의 키- 위와 같이 정의된 엔티티에
@Id
어노테이션을 통해 id 값이 redis에서 자동으로 저장됨
- String : UUID 로 자동 저장
public interface ItemRepository extends CrudRepository<Item, String> {
}
주로 RDB를 이용할 때 사용하던
JpaRepository
대신CrudRepository
를 사용하여 Redis 데이터를 쉽게 다룰 수 있다.
- CrudRepository 는 redis 용으로 사용하는 게 아니라
Repository
를 상속한 단순한 CRUD 용 repository 인터페이스
@RedisHash
를 엔티티에 지정해줌으로써 간단하게 CRUD 동작을 수행할 수 있다.
import com.example.redis.repository.ItemRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class RedisRepositoryTest {
@Autowired
ItemRepository itemRepository;
@Test
public void createTest(){
Item item = Item.builder()
.name("keyboard")
.description("very expensive")
.price(100000)
.build();
itemRepository.save(item);
}
@Test
public void readOneTest() {
Item item = itemRepository.findById("24a6d54f-b10c-4afe-8981-6b4194cc6549").orElse(null);
assert item != null;
System.out.println(item.getDescription());
}
@Test
public void updateOneTest() {
Item item = itemRepository.findById("93277c69-95c8-4b29-b823-334dcec5b548").orElse(null);
assert item != null;
item.setDescription("chip");
var updated = itemRepository.save(item);
System.out.println(updated.getDescription());
}
@Test
public void deleteOneTest() {
itemRepository.deleteById("6ea60a49-783f-4e7b-b2d4-37514017785e");
}
}
아래는 createTest
시 redis 의 담긴 데이터의 모습이다.
- hash tables : Item 정보 자체가 field value로 저장.
- sets : 실제로 사용되는 Item 의 key 값을 관리하기 위한 set (
@Id
에 해당하는 field 의 value 만 저장됨 )
위와 같이 @RedisHash
를 사용하면 별 다른 설정 없이도 간단하게 CRUD 를 구현할 수 있다.
하지만, 실제로 redis 를 위 객체 데이터를 저장하는 데만 사용하지는 않기 때문에 RedisTemplate
을 이용해 보다 디테일한 기능 구현을 할 수 있다.