728x90
사용배경:
모 회사에서 페이서비스를 만든다고 하자. 서로다른 고객 서로 다른 페이방식을 사용할것이다. 예컨대 , 네이버 페잇, 카카오페이, 유니온페이 등등.이때 일반적으로 if else 혹은 switch 로 고객타입을 체크하여 그에 맞는 페이방식을 사용하도록 코드를 작성할것이다.
그래서 한번 전략패턴으로 if 문 혹은 switch 문없이 처리해보겠다.
Base인터페이스 하나 만든다.
public interface BasePayment {
/**
* 기본 인터페이스
* @param order
* @return
*/
PayResult pay(Order order);
}
Order 정보 클래스를 만든다.
@Data
public class Order {
/**
* 금액
*/
private int amount;
/**
* 페이유형
*/
private String paymentType;
}
Return 타입클래스도 만든다.
@Data
@AllArgsConstructor
public class PayResult {
/**
* 처리결과
*/
private String result;
}
이제 Base 인터페이스 기준으로 각종? 구현 클래스를 한번 만들어 보자. (카카오 페이, 네이버 페이 등등 )
@Service("NaverPay")
public class NaverPay implements BasePayment {
@Override
public PayResult pay(Order order) {
return new PayResult("네이버 페이 결제 성공!");
}
}
@Service("KakaoPay")
public class KakaoPay implements BasePayment {
@Override
public PayResult pay(Order order) {
return new PayResult("카카오페이 결제 성공!");
}
}
뭐 유니온 페이도 한번 만들어본자 ^^
@Service("UnionPay")
public class UnionPay implements IPayment {
@Override
public PayResult pay(Order order) {
return new PayResult("인련페이 지불성공");
}
}
이제 컨트롤러를 하나 만들어보자
@RestController
public class PayService {
@Autowired
private ApplicationContext applicationContext;
/**
* 컨트롤러
* @param amount
* @param paymentType
* @return
*/
@RequestMapping("/pay")
public PayResult pay(@RequestParam("amount") int amount,
@RequestParam("paymentType") String paymentType) {
Order order = new Order();
order.setAmount(amount);
order.setPaymentType(paymentType);
// paymentType으로 bean을 컨테이너로 부터 가져올수 있지
IPayment payment = applicationContext.getBean(order.getPaymentType(), BasePayment.class);
// 지불시작
PayResult payResult = payment.pay(order);
return payResult;
}
}
끝!
'Back-end > Spring&SpringBoot' 카테고리의 다른 글
Stream.toList() vs Collectors.toList() 성능비교 (0) | 2022.12.13 |
---|---|
SpringBoot + SpringSecurity +JWT = RBAC (0) | 2022.12.13 |
아직도 if...else... data 검증을 하는 당신에게! (0) | 2022.12.08 |
Request 객체속성 분석 (0) | 2022.12.07 |
Spring MVC DataSource 설정[한글깨짐] (0) | 2022.12.07 |