반응형
자바의 Supplier와 Consumer 인터페이스는 자바 8에서 소개된 함수형 인터페이스로, 각각 데이터를 제공하는 로직과 데이터를 소비하는 로직을 간단하게 표현하는데 사용됩니다.
Supplier 인터페이스
Supplier<T> 인터페이스는 파라미터를 받지 않고 값을 리턴하는 get() 메소드를 가지고 있습니다.
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Consumer 인터페이스
반면 Consumer<T> 인터페이스는 파라미터를 하나 받아서 소비하고 (처리하고) 리턴 값이 없는 accept() 메소드를 가지고 있습니다
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
예제: 온라인 쇼핑몰 결제 로직 처리
1. 결제 정보 및 요청 DTO 정의
public class PaymentRequest {
private String userId;
private double amount;
// ... getters and setters ...
}
public class PaymentResponse {
private String status;
private String transactionId;
// ... getters and setters ...
}
2. Supplier 및 Consumer 활용한 서비스 클래스 정의
@Service
public class PaymentService {
private final Map<String, Supplier<Consumer<PaymentRequest>>> paymentStrategies;
public PaymentService() {
this.paymentStrategies = new HashMap<>();
paymentStrategies.put("credit", () -> this::handleCreditPayment);
paymentStrategies.put("paypal", () -> this::handlePayPalPayment);
}
public void pay(String method, PaymentRequest request) {
Consumer<PaymentRequest> paymentStrategy =
Optional.ofNullable(paymentStrategies.get(method))
.orElseThrow(()
-> new IllegalArgumentException("Invalid payment method: " + method))
.get();
paymentStrategy.accept(request);
}
private void handleCreditPayment(PaymentRequest request) {
// handle credit card payment...
System.out.println("Credit payment: " + request.getAmount());
}
private void handlePayPalPayment(PaymentRequest request) {
// handle PayPal payment...
System.out.println("PayPal payment: " + request.getAmount());
}
}
여기서, Supplier<Consumer<PaymentRequest>> 형태를 사용하여 지연 로딩(lazy loading) 전략을 적용하였습니다. 즉, 결제 방법에 따른 로직은 실제로 호출되는 시점에 생성되고 처리됩니다.
3. 컨트롤러 클래스 정의
@RestController
@RequestMapping("/api/payment")
public class PaymentController {
@Autowired
private PaymentService paymentService;
@PostMapping("/{method}")
public ResponseEntity<String> pay(@PathVariable String method,
@RequestBody PaymentRequest request) {
paymentService.pay(method, request);
return ResponseEntity.ok("Payment successful!");
}
}
정리
이 예제에서는 Supplier 인터페이스를 활용하여 결제 처리 로직 (Consumer)을 제공하고, Consumer를 활용하여 받은 PaymentRequest를 처리하는 방법을 보여줍니다. 이러한 방식은 결제 처리 로직이 상황에 따라 동적으로 결정되어야 할 때 유용하게 사용될 수 있습니다.
반응형
'SpringBoot' 카테고리의 다른 글
스프링의 RedisLockRegistry를 활용한 제한된 상품의 동시성 제어 및 주문 처리 (0) | 2023.10.09 |
---|---|
스프링 부트에서 외부 API 서비스를 병렬 처리하여 응답하는 방법 (0) | 2023.10.09 |
Spring Boot Config Server (0) | 2023.09.29 |
Spring boot Private field and method Test (0) | 2022.05.22 |
Spring boot Throwing Exception test (0) | 2022.05.22 |