Redis 활용예제 2 - 주문 CRUD 구현

StrayCat·2026년 3월 16일

예제 요약

ItemOrder 클래스를 @RedisHash로 만들기

주문 ID : String
판매 물품 : String
갯수 : Integer
총액 : Long
주문 상태 : String

주문 CRUD 구현

ID를 제외한 나머지 속성값을 클라이언트에서 전달
성공하면 저장된 ItemOrder를 응답


코드

ItemOrder

import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
// Entity 대신 RedisHash
@RedisHash("itemorder")
public class ItemOrder {

    @Id
    private String id;
    private String productName;
    private Integer quantity;
    private Long totalPrice;
    private String orderStatus;
}

ItemOrderRequest

import lombok.Getter;

@Getter
public class ItemOrderRequest {

    private String productName;   // 판매 물품
    private Integer quantity;     // 갯수
    private Long totalPrice;      // 총액
    private String orderStatus;   // 주문 상태
}

ItemController

import com.example.redis.dto.ItemOrder;
import com.example.redis.dto.ItemOrderRequest;
import com.example.redis.service.ItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * ItemOrder 클래스를 @RedisHash로 만들기
 *
 * 주문 ID : String
 * 판매 물품 : String
 * 갯수 : Integer
 * 총액 : Long
 * 주문 상태 : String
 *
 *
 * 주문 CRUD 구현
 *
 * ID를 제외한 나머지 속성값을 클라이언트에서 전달
 * 성공하면 저장된 ItemOrder를 응답
 */

@RestController
@RequiredArgsConstructor
@RequestMapping("/item")
public class ItemController {

    private final ItemService itemService;

    // 주문 CREATE
    @PostMapping
    public ItemOrder createOrder(@RequestBody ItemOrderRequest request) {
        return itemService.createOrder(request);
    }

    // 주문 READ
    @GetMapping("/{id}")
    public ItemOrder getOrder(@PathVariable String id) {
        return itemService.getOrder(id);
    }

    // 주문 UPDATE - null값 받으면 기존값 유지
    @PatchMapping("/{id}")
    public ItemOrder updateOrder(@PathVariable String id, @RequestBody ItemOrderRequest request) {
        return itemService.updateOrder(id, request);
    }

    // 주문 DELETE
    @DeleteMapping("/{id}")
    public String deleteOrder(@PathVariable String id) {
        itemService.deleteOrder(id);
        return id + "번 주문 삭제 완료";
    }
}

ItemService

import com.example.redis.dto.ItemOrder;
import com.example.redis.dto.ItemOrderRequest;
import com.example.redis.repository.ItemOrderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service
public class ItemService {

    private final ItemOrderRepository itemOrderRepository;

    public ItemOrder createOrder(ItemOrderRequest request) {

        ItemOrder order = ItemOrder.builder()
                .productName(request.getProductName())
                .quantity(request.getQuantity())
                .totalPrice(request.getTotalPrice())
                .orderStatus(request.getOrderStatus())
                .build();

        // ID는 save 시점에 생성
        return itemOrderRepository.save(order);
    }


    public ItemOrder getOrder(String id) {
        return findOrderById(id);
    }

    public ItemOrder updateOrder(String id, ItemOrderRequest request) {
        // 기존데이터 먼저 조회 -> 없으면 예외
        ItemOrder order = findOrderById(id);

        // null이 아닌 경우에만 업데이트
        if (request.getProductName() != null) order.setProductName(request.getProductName());
        if (request.getQuantity() != null) order.setQuantity(request.getQuantity());
        if (request.getTotalPrice() != null) order.setTotalPrice(request.getTotalPrice());
        if (request.getOrderStatus() != null) order.setOrderStatus(request.getOrderStatus());

        // 같은 ID로 save() 하면 덮어쓰기 (update)완료
        return itemOrderRepository.save(order);
    }

    public void deleteOrder(String id) {
        // Id 존재여부만 체크 -> 있으면 삭제
        findOrderById(id);
        itemOrderRepository.deleteById(id);
    }

    // 공통 조회 메서드 - private로 내부에서만 사용
    private ItemOrder findOrderById(String id) {
        // findById()는 Optional 반환 -> 없는 아이디면 예외 던짐
        return itemOrderRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("주문을 찾을 수 없습니다. id: " + id));
    }
}
profile
알면 좋은 것보단 잊어버리기 싫은 것들을 기록합니다.

0개의 댓글