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;
    }
 
}

끝!

+ Recent posts