주문 ID : String
판매 물품 : String
갯수 : Integer
총액 : Long
주문 상태 : String
ID를 제외한 나머지 속성값을 클라이언트에서 전달
성공하면 저장된 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;
}
import lombok.Getter;
@Getter
public class ItemOrderRequest {
private String productName; // 판매 물품
private Integer quantity; // 갯수
private Long totalPrice; // 총액
private String orderStatus; // 주문 상태
}
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 + "번 주문 삭제 완료";
}
}
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));
}
}