카테고리:

업데이트:

1. 들어가기

이전 포스트에서는 토스페이와 카카오페이 간편결제를 개발해보았습니다.

이번에는 앞서 작성했던 코드를 리팩토링 해보겠습니다.

2. Service 구조 파악

우리가 작성했던 코드를 다시 봅시다.

  @RestController
  @RequestMapping("/easy-pay")
  public class EasyPayController {

    // 토스페이 요청 API
    @PostMapping("/request/toss")
    public JSONObject createTossPay() { ... }

    // 토스페이 승인 API
    @PostMapping("/approve/toss")
    public JSONObject approveTossPay(@RequestBody TossPay tossPay) { ... }

    // 카카오페이 요청 API
    @PostMapping("/request/kakao")
    public JSONObject createKakaoPay() { ... }

    // 카카오페이 승인 API
    @PostMapping("/approve/kakao")
    public JSONObject approveKakaoPay(@RequestBody TossPay tossPay) { ... }
  }

예를 들어 이 구조에서 네이버페이가 추가되었다고 생각해봅시다.

그렇다면 다음과 같이 네이버페이 요청, 승인 코드가 2개 추가됩니다.

  @RestController
  @RequestMapping("/easy-pay")
  public class EasyPayController {

    // 토스페이 요청 API
    @PostMapping("/request/toss")
    public JSONObject createTossPay() { ... }

    // 토스페이 승인 API
    @PostMapping("/approve/toss")
    public JSONObject approveTossPay(@RequestBody TossPay tossPay) { ... }

    // 카카오페이 요청 API
    @PostMapping("/request/kakao")
    public JSONObject createKakaoPay() { ... }

    // 카카오페이 승인 API
    @PostMapping("/approve/kakao")
    public JSONObject approveKakaoPay(@RequestBody KakaoPay kakaoPay) { ... }

    // 네이버페이 요청 API
    @PostMapping("/request/naver")
    public JSONObject createNaverPay() { ... }

    // 네이버페이 승인 API
    @PostMapping("/approve/naver")
    public JSONObject approveNaverPay(@RequestBody NaverPay naverPay) { ... }
  }

추가로 페이코, KB페이 등 여러 간편결제가 추가된다면 아래로 계속 늘어나겠죠?

그렇게 된다면 우리가 특정 간편결제를 수정하고 싶을 때 한참 찾아야하는 단점이 있습니다.

즉, 확장성과 가독성이 좋지 않다는 것이죠.

이러한 불편함을 개선하기 위해 리팩토링해봅시다.

우리가 작성한 코드를 자세히 보면 크게 요청, 승인의 두 가지 action이 있음을 확인할 수 있습니다.

사실 간편 결제 시스템이 Two Factor 구조니깐 당연할 수도 있겠네요 ㅎㅎ

그럼 두 개의 추상 메서드를 가진 인터페이스와 그 메서드를 구현한 클래스를 만든다면 수정이 용이하겠죠?

이처럼 전체 흐름의 일부분을 서브 클래스로 캡슐화하고

전체 흐름은 그대로 둔 채 일부분만 변경하는 디자인 패턴을 템플릿 메서드 패턴이라고 합니다.

그럼, 템플릿 메서드 패턴을 사용해 구조를 분리해봅시다.

3. Service 분리

먼저 간편결제 인터페이스를 생성합니다.

// 간편결제 인터페이스
  public interface EasyPayService {

    // 결제 요청 API
    JSONObject request(EasyPay easyPay);

    // 결제 승인 API
    JSONObject approve(EasyPay easyPay);
  }

간편결제 인터페이스는 요청과 승인 두 개의 추상 메서드를 가집니다.

그리고 토스페이와 카카오페이 클래스에서는 앞서 만들었던 추상 메서드를 구현하면 됩니다.

// 토스페이 클래스
  @Service
  public class TossPayService implements EasyPayService {

    // 결제 요청 API
    @Override
    public JSONObject request(EasyPay easyPay) { ... }

    // 결제 승인 API
    @Override
    public JSONObject approve(EasyPay easyPay) { ... }
    
  }
// 카카오페이 클래스
  @Service
  public class KakaoPayService implements EasyPayService {

    // 결제 요청 API
    @Override
    public JSONObject request(EasyPay easyPay) { ... }

    // 결제 승인 API
    @Override
    public JSONObject approve(EasyPay easyPay) { ... }

  }

템플릿 메서드 패턴을 적용하면 상위 클래스의 메서드만 보더라도 전체 동작을 이해할 수 있고

서브 클래스 재정의를 통한 확장에 유리하다는 장점이 있습니다.


다음 포스트에서는 분리한 서비스들을 호출할 Controller를 리팩토링 해보겠습니다.

Controller 리팩토링

            
              📕 개인 기록용 블로그입니다.
              😊 오타나 잘못된 정보가 있을 경우 댓글이나 메일로 말씀해주시면 바로 수정하겠습니다! 😊
          

댓글남기기