Redis는 높은 성능과 다양한 데이터 구조 지원 덕분에 많은 애플리케이션에서 캐싱, 세션 저장소, 메시지 큐 등으로 사용됩니다. Spring
Boot에서는 Redis와의 통합이 매우 간편하게 이루어집니다.
이번 포스팅에서는 "Spring boot에서의 Redis 사용"에 대해 공부한 지식을 정리하고자 작성합니다.
Spring boot 프로젝트 설정
Spring Boot에서 Redis를 사용하기 위해서는 의존성을 추가해야 합니다. pom.xml 또는 build.gradle 파일에 다음 의존성을 추가합니다.
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Redis Configuration 설정
spring:
redis:
host: localhost
port: 6379
username: <사용자 계정, 기본값 default>
password: <사용자 비밀번호>
Spring Boot에서 Redis를 사용할 때, 두 가지 주요 접근 방식이 있습니다.
Redis Repository와 RedisTemplate. 각 접근 방식은 Redis와의 상호작용을 간편하게 처리할 수 있게 해 주지만, 용도와 사용 방식에 따라 선택할 수 있습니다.
Spring boot에서 RedisRepository사용하기
Redis를 사용할 때, Spring Data Redis의 Repository 인터페이스를 활용하여 더 간편하게 데이터 액세스를 관리할 수 있습니다.
이 접근법은 데이터 액세스를 객체 지향적으로 관리할 수 있게 해주며, 복잡한 Redis 쿼리를 작성할 필요 없이 간단한 CRUD 작업을 수행할 수 있습니다.
Spring Data Redis는 Spring Data 프로젝트의 일환으로, Redis와의 상호작용을 위한 강력한 지원을 제공합니다.
1. Redis에 저장할 도메인 객체 정의
// package, import 생략
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@RedisHash("item")
public class Item implements Serializable {
@Id
private Long id;
private String name;
private String description;
private Integer price;
}
Redis는 기본적으로 키-값 쌍으로 데이터를 저장합니다. Redis의 데이터 모델을 객체로 매핑하기 위해 도메인 클래스를 정의합니다. 이 도메인 클래스는 @RedisHash 어노테이션을 사용하여 Redis에 저장될 수 있게 지정합니다.
Serializable인터페이스
Java에서 객체를 직렬화(바이트 스트림으로 변환)하고 역직렬화(바이트 스트림을 객체로 복원)할 수 있게 해주는 인터페이스입니다.
이 인터페이스는 메서드를 정의하지 않으며, 단순히 직렬화 가능 객체를 표시하는 마커 역할을 합니다.
2. Repository 인터페이스 정의
public interface ItemRepository extends CrudRepository<Item, Long> {}
Spring Data Redis는 CrudRepository와 PagingAndSortingRepository를 상속하여 CRUD 기능을 제공하는 Repository 인터페이스를 지원합니다.
3. Redis Repository 사용
Spring Boot 애플리케이션에서 Redis를 사용할 때, RedisRepository와 RedisTemplate은 보통 서비스와 컨트롤러를 통해 사용됩니다. 그러나 테스트에서 이들을 간단히 사용하는 방법을 살펴보겠습니다.
Create
@SpringBootTest
public class RedisRepositoryTests {
@Autowired
private ItemRepository itemRepository;
@Test
public void createTest(){
//객체를 만들고 itemRepository에 save()메서드를 호출한다.
Item item = Item.builder()
//.id(1L)
.name("Iphone")
.description("IphoneSE2")
.price(100000)
.build();
itemRepository.save(item);
}
}
먼저 @SpringBootTest 어노테이션을 사용하여 테스트에서 필요한 Bean들을 모두 주입받아줍니다.
테스트를 실행해보면,
Set과 Hash Table이 생성되었습니다.
해시 테이블에는랜덤 한 Long 값이 들어가 있으며, 이는 Redis가 전통적인 RDBMS와 다르게 주로 임시 데이터를 저장하는 데 사용되기 때문입니다.
여기서는 ID를 명시적으로 설정하지 않았기 때문에, 구분하기 쉬운 랜덤한 값이 사용되었습니다. 즉, Redis에서는 ID를 명시적으로 설정해주지 않으면 데이터가 1부터 순차적으로 증가하지 않고 랜덤한 값으로 저장됩니다.
정리하자면, RedisHash("item")을 가진 엔티티가 레포지토리를 통해 추가되면 다음과 같은 과정이 발생합니다.
1. Set 생성
- 이 Set은 현재 Redis에 저장된 아이템들을 추적하기 위해 사용됩니다.
- Sets: 생성된 ID(ID들의 집합)
2. 해시 테이블 생성
- 해시 테이블에는 실제 아이템의 데이터가 저장됩니다."
- 해당 ID에 대한 실제 데이터(Hash 값)
데이터 저장 목적으로 item이라는 데이터를 Redis에 직접 넣는 방식은 일반적으로 사용되지 않습니다. 위 코드에서는 테스트 목적으로 Item이라는 이름을 사용했지만, 실제로는 세션 정보와 같은 임시 데이터에 활용하는 것이 좋습니다.
READ
Item item = Item.builder().id(1L)
데이터를 읽을 때 구별을 쉽게 하기 위해, 위의 테스트 코드에서 ID 주석을 해제하고 ID가 1인 데이터를 추가하면, Sets에 생성된 ID들의 집합이 저장된 것을 확인할 수 있습니다.
itemRepository.findById(1L)
- itemRepository는 데이터베이스에서 Item을 조회할 수 있는 레포지토리입니다.
- findById(1L) 메서드는 ID가 1L인 아이템을 데이터베이스에서 조회합니다.
위 실행결과를 보면 ID가 1L인 아이템을 데이터베이스에서 조회하고, 조회된 아이템의 설명을 출력했을 때 정상적으로 출력된 것을 확인할 수 있습니다.
UPDATE
마찬가지로, DB에서 Item을 조회할 수 있는 레포지토리 itemRepository를 사용하여 ID가 1인 Item 데이터를 가져옵니다.
이후, setDescription 메서드를 사용해 Description을 'Iphone SE2' ➡️ 'Iphone 15'로 수정하고, 변경된 내용을 저장한 후 출력해 보겠습니다.
Redis의 데이터도 정상적으로 수정되었고, description도 업데이트되어 정상적으로 출력된 것을 확인할 수 있습니다.
DELETE
마찬가지로, DB에서 Item을 조회할 수 있는 레포지토리 itemRepository를 사용하여 ID가 1인 Item 데이터를 deleteById() 메서드로 삭제를 합니다.
실행결과를 보면 정상적으로 ID가 1인 데이터가 삭제된 것을 확인할 수 있습니다.
Redis에서의 ID 선언 및 UUID 자동 생성
// @Id
// private Long id;
@Id
private String id;
Redis에서는 id를 보통 String으로 선언합니다.
String 타입으로 선언하고 @Id 어노테이션을 붙이면 위와 같이 UUID가 자동으로 생성됩니다. UUID는 임시로 사용하기 위한 ID로, 자동으로 생성됩니다.
UUID란❓
UUID(Universally Unique Identifier)는 전 세계적으로 유일한 식별자를 생성하기 위해 사용되는 128비트 값입니다.
구분하기 위한 Token값으로 자주 사용됩니다.
'Database > redis' 카테고리의 다른 글
[Redis] Spring Boot와 Redis로 세션 클러스터링 구현하기 (0) | 2024.08.11 |
---|---|
[Redis] Spring boot에서의 Redis사용하기 #2 : RedisTemplate (0) | 2024.08.10 |
[Redis] Redis의 주요 타입 살펴보기 (0) | 2024.08.08 |
[Redis] 인메모리 저장소와 redis란 무엇일까❓ (0) | 2024.08.06 |