Spring Boot에서 Redis 사용해보기
💡Redis의 Hash 자료구조로 저장되는 엔티티(Entity) 만들기
엔티티(Entity) : 저장소(DB, Redis 등)에 저장되는 도메인 객체(클래스)
도메인 객체(Domain Object) : 서비스가 다루는 현실 세계의 개념(ex. 상품, 주문, 계좌 등) 들을 코드로 표현한 객체
1) 요구사항
- 아래와 같은 도메인 객체의 속성(필드)을 가지는 주문 ID, 판매 물품, 갯수, 총액, 결제 여부에 대한 데이터를 지정하기 위한 ItemOrder 클래스를 RedisHash 만들기
1. 주문 ID - String
2. 판매 물품 - String
3. 갯수 - Integer
4. 총액 - Long
5. 주문 상태 - String
2) 코드 구현
- ItemOrder.java
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@RedisHash("order")
public class ItemOrder {
@Id
private String id;
private String item;
private Integer count;
private Long totalPrice;
private String status;
}
➡️ @RedisHash
- 이 클래스가 Redis의 Hash 자료구조로 저장되는 엔티티(Entity)라는 것을 Spring에게 알려준다.
💡주문에 대한 CRUD를 진행하는 기능
1) 요구사항
- ItemOrder의 속성값들을 ID를 제외하고 클라이언트에서 전달해준다. (Spring Boot 서버에서 ID를 생성해야 함)
- 성공하면 저장된 ItemOrder를 사용자에게 응답해준다.
2) 코드 구현 : Spring Data Redis Repository 의 CrudRepository 활용
- OrderRepository.java
import org.springframework.data.repository.CrudRepository;
public interface OrderRepository
extends CrudRepository<ItemOrder, String> {}
➡️ CrudRepository
- 기본적인 CURD 메서드를 제공하는 인터페이스 (save(), findById(), deleteById() ... )
- OrderController.java
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("orders")
public class OrderController {
private final OrderRepository orderRepository;
public OrderController(
OrderRepository orderRepository
) {
this.orderRepository = orderRepository;
}
@PostMapping
public ItemOrder create(
@RequestBody
ItemOrder order
) {
return orderRepository.save(order);
}
@GetMapping
public List<ItemOrder> readAll() {
List<ItemOrder> orders = new ArrayList<>();
orderRepository.findAll()
.forEach(orders::add);
return orders;
}
@GetMapping("{id}")
public ItemOrder readOne(
@PathVariable("id")
String id
) {
return orderRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
}
@PutMapping("{id}")
public ItemOrder update(
@PathVariable("id")
String id,
@RequestBody
ItemOrder order
) {
ItemOrder target = orderRepository
.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
target.setItem(order.getItem());
target.setCount(order.getCount());
target.setTotalPrice(order.getTotalPrice());
target.setStatus(order.getStatus());
return orderRepository.save(target);
}
@DeleteMapping("{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(
@PathVariable("id")
String id
) {
orderRepository.deleteById(id);
}
}
3) 코드 구현 : RedisTemplate 을 활용해 직접 Redis 명령을 사용
- RedisConfig.java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Integer> articleTemplate(
RedisConnectionFactory redisConnectionFactory
) {
RedisTemplate<String, Integer> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(RedisSerializer.string());
template.setValueSerializer(new GenericToStringSerializer<>(Integer.class));
return template;
}
}
➡️ RedisTemplate Bean 생성하는 코드
3-1) 각 코드 의미
- @Configuration : Spring Bean 설정을 하는 클래스라는 의미
- @Bean
- 해당 어노테이션이 붙은 메서드가 반환하는 객체를 Spring Bean 으로 등록 한다.
- 즉, 위 코드에서는 RedisTemplate 을 Spring 이 관리하게 된다.
- RedisConnectionFactory : Redis 서버와 연결을 만드는 객체
- RedisTemplate
RedisTemplate<String, Integer>
➡️ Redis 명령을 실행하는 클래스
➡️ 예시
redisTemplate.opsForValue().increment("article:1");
- Serializer 설정 (중요)
template.setValueSerializer(
new GenericToStringSerializer<>(Integer.class)
);
➡️ Redis 는 문자열 기반 저장소이기 때문에 Java 객체를 Redis 저장 가능 형태로 변환 해야 한다.
이를 Serializer 라고 하고 위 코드는 Integer → String 변환하고 있다.
3-2) ArticleController.java
- RedisConfig로 설정한 RedisTemplate 클래스를 Controller에서 사용하는 예시
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("articles")
public class ArticleController {
private final ValueOperations<String, Integer> ops;
public ArticleController(
RedisTemplate<String, Integer> articleTemplate
) {
ops = articleTemplate.opsForValue();
}
@GetMapping("{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void read(
@PathVariable("id")
Long id
) {
ops.increment("articles:%d".formatted(id));
}
}
참고 자료
https://teamsparta.notion.site/1-6-2-2242dc3ef51481f3a285e1abb7bd48e8
챕터1-6 : 실습2 | Notion
Spring Boot에서 Redis 사용해보기
teamsparta.notion.site
'심화 > DB' 카테고리의 다른 글
| [DB] Redis 실습 1 (0) | 2026.03.04 |
|---|---|
| [DB] Spring에서 Redis 사용해보기 : RedisTemplate 써보기 (0) | 2026.03.03 |
| [DB] Spring에서 Redis 사용해보기 (0) | 2026.03.02 |
| [DB] Redis 타입 살펴보기 (공부중..) (0) | 2026.02.27 |
| [DB] Redis 설치하기 (MacOS) (0) | 2026.02.26 |