심화/DB

[DB] Redis 실습 2

annovation 2026. 3. 5. 23:11

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