Menu
Coddy logo textTech

요약 - 결제 프로세서

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 46번째.

challenge icon

챌린지

쉬움

이 장에서 다룬 모든 다형성 개념을 하나로 모아 완전한 결제 처리 시스템을 만들어 보겠습니다. 통합 인터페이스를 통해 작동하는 다양한 결제 방법, 의존성 주입을 통해 모든 결제 방법을 허용하는 프로세서, 그리고 다형적 컬렉션을 통해 여러 결제를 처리하는 기능을 만들게 됩니다.

코드를 네 개의 파일로 구성합니다:

  • payment.go: PaymentMethod 인터페이스를 정의하고, Process(amount float64) string 메서드를 요구하도록 합니다. 이는 모든 결제 유형이 충족해야 하는 계약입니다.
  • methods.go: 각각 PaymentMethod 인터페이스를 구현하는 세 가지 결제 유형을 만듭니다:
    • CreditCard: CardNumber (string) 및 HolderName (string) fields를 가집니다. Process 메서드는 Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]을 반환합니다.
    • PayPal: Email field를 가집니다. Process 메서드는 PayPal payment of $[amount] from [Email]을 반환합니다.
    • BankTransfer: BankNameAccountNumber fields를 가집니다. Process 메서드는 Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])을 반환합니다.
  • processor.go: PaymentMethod (주입된 dependency)를 보유하는 PaymentProcessor 구조체를 만듭니다. PaymentMethod를 accepts하는 NewPaymentProcessor constructor를 포함합니다. 주입된 결제 방법에 위임하는 ExecutePayment(amount float64) string 메서드를 추가합니다. 또한 slice의 각 결제 방법을 통해 동일한 amount를 처리하고 모든 결과를 반환하는 ProcessAll(payments []PaymentMethod, amount float64) []string function을 만듭니다.
  • main.go: 입력에서 결제 세부 정보를 읽고, 세 가지 결제 유형을 모두 만들며, dependency injection과 다형적 컬렉션을 모두 보여 줍니다. 먼저 신용 카드와 함께 NewPaymentProcessor를 사용하여 결제를 실행합니다. 그런 다음 세 가지 결제 방법을 모두 slice에 모으고 ProcessAll을 사용하여 두 번째 amount로 모두 처리합니다. 각 결과를 한 줄씩 출력합니다.

다음 입력이 제공됩니다:

  • 1번째 줄: 신용 카드 번호 (예: 4532015112830366)
  • 2번째 줄: 카드 소유자 이름
  • 3번째 줄: PayPal 이메일
  • 4번째 줄: 은행 이름
  • 5번째 줄: 계좌 번호 (예: 987654321)
  • 6번째 줄: 첫 번째 결제 금액 (단일 프로세서용)
  • 7번째 줄: 두 번째 결제 금액 (일괄 처리용)

금액은 소수점 이하 두 자리로 형식화합니다. 예를 들어 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99, 50이 주어졌을 때 출력은 다음과 같아야 합니다:

Credit Card 0366 charged $99.99 to John Smith
Credit Card 0366 charged $50.00 to John Smith
PayPal payment of $50.00 from john@email.com
Bank transfer of $50.00 via Chase (***321)

첫 번째 줄은 주입된 프로세서를 통한 단일 결제를 보여 줍니다. 나머지 세 줄은 다형적 컬렉션을 통한 일괄 처리를 보여 줍니다. 즉, 동일한 ProcessAll function이 모든 결제 유형을 일관되게 처리하며, 인터페이스를 통해 유연하고 확장 가능한 결제 시스템을 구현할 수 있음을 보여 줍니다.

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 입력 읽기
	cardNumber, _ := reader.ReadString('\n')
	cardNumber = strings.TrimSpace(cardNumber)

	holderName, _ := reader.ReadString('\n')
	holderName = strings.TrimSpace(holderName)

	email, _ := reader.ReadString('\n')
	email = strings.TrimSpace(email)

	bankName, _ := reader.ReadString('\n')
	bankName = strings.TrimSpace(bankName)

	accountNumber, _ := reader.ReadString('\n')
	accountNumber = strings.TrimSpace(accountNumber)

	amount1Str, _ := reader.ReadString('\n')
	amount1Str = strings.TrimSpace(amount1Str)
	amount1, _ := strconv.ParseFloat(amount1Str, 64)

	amount2Str, _ := reader.ReadString('\n')
	amount2Str = strings.TrimSpace(amount2Str)
	amount2, _ := strconv.ParseFloat(amount2Str, 64)

	// TODO: 세 가지 결제 유형 생성 (CreditCard, PayPal, BankTransfer)

	// TODO: NewPaymentProcessor를 사용하여 신용 카드로 PaymentProcessor 생성
	// 그리고 amount1로 결제를 실행한 다음 결과를 출력

	// TODO: 세 가지 결제 유형을 모두 포함하는 PaymentMethod 슬라이스 생성

	// TODO: ProcessAll을 사용하여 amount2로 모든 결제 처리
	// 그리고 각 결과를 한 줄씩 출력
}

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Go 컴파일러