ASP.NET Core MVC에서 Braintree 결제 서비스 뼈대 구축하기

  • 4 minutes to read

이 문서는 ASP.NET Core MVC 프로젝트에서 **Braintree 결제 기능을 사용하기 위한 최소한의 기본 구조(뼈대)**를 구축하는 방법을 단계별로 안내합니다. 아직 Braintree를 실제로 사용하지 않더라도, 아래 구성은 이후 쉽게 확장 가능한 표준 패턴을 기반으로 작성되었습니다.


1. appsettings.json에 Braintree 설정 추가

프로젝트의 설정 파일인 appsettings.json에 다음과 같이 Braintree 설정 섹션을 추가합니다.

{
  "Braintree": {
    "Environment": "sandbox",
    "MerchantId": "your-merchant-id",
    "PublicKey": "your-public-key",
    "PrivateKey": "your-private-key",
    "ClientSideEncryptionKey": "your-client-side-encryption-key"
  }
}

운영 환경에서는 "Environment": "production"으로 변경합니다.


2. Braintree 옵션 클래스 추가 (BraintreeOptions.cs)

설정 파일의 "Braintree" 섹션을 Strongly Typed 객체로 바인딩하기 위해 다음 옵션 클래스를 /Payments/Braintree/ 폴더에 생성합니다.

namespace Azunt.Web.Payments.Braintree
{
    public class BraintreeOptions
    {
        public string Environment { get; set; } = "sandbox";
        public string MerchantId { get; set; } = string.Empty;
        public string PublicKey { get; set; } = string.Empty;
        public string PrivateKey { get; set; } = string.Empty;
        public string? ClientSideEncryptionKey { get; set; }
    }
}

3. 서비스 인터페이스 추가 (IBraintreeService.cs)

Braintree 관련 기능을 추상화하기 위해 다음 인터페이스를 생성합니다.

using System.Threading.Tasks;

namespace Azunt.Web.Payments.Braintree
{
    public interface IBraintreeService
    {
        Task<string> GenerateClientTokenAsync();

        Task<object?> CreateTransactionAsync(
            decimal amount,
            string paymentMethodNonce,
            string? orderId = null);
    }
}

이 구조는 나중에 Stripe, PayPal 등 다른 PG를 추가할 때도 확장성을 높여줍니다.


4. Braintree 서비스 구현 (BraintreeService.cs)

실제 SDK와 통신하는 구현 클래스를 추가합니다.

using System.Threading.Tasks;
using Braintree;
using Microsoft.Extensions.Options;

namespace Azunt.Web.Payments.Braintree
{
    public class BraintreeService : IBraintreeService
    {
        private readonly BraintreeGateway _gateway;

        public BraintreeService(IOptions<BraintreeOptions> options)
        {
            var opt = options.Value;

            var environment = opt.Environment?.ToLowerInvariant() switch
            {
                "production" => Braintree.Environment.PRODUCTION,
                _ => Braintree.Environment.SANDBOX
            };

            _gateway = new BraintreeGateway(
                environment,
                opt.MerchantId,
                opt.PublicKey,
                opt.PrivateKey);
        }

        public Task<string> GenerateClientTokenAsync()
        {
            return _gateway.ClientToken.GenerateAsync();
        }

        public async Task<object?> CreateTransactionAsync(
            decimal amount,
            string paymentMethodNonce,
            string? orderId = null)
        {
            var request = new TransactionRequest
            {
                Amount = amount,
                PaymentMethodNonce = paymentMethodNonce,
                OrderId = orderId,
                Options = new TransactionOptionsRequest
                {
                    SubmitForSettlement = true
                }
            };

            var result = await _gateway.Transaction.SaleAsync(request);
            return result;
        }
    }
}

Client Token 생성과 결제 트랜잭션 생성은 이 서비스가 담당합니다.


5. Program.cs에서 서비스 등록

다음 코드를 Program.cs에 추가하여 DI 컨테이너에 등록합니다.

using Azunt.Web.Payments.Braintree;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<BraintreeOptions>(
    builder.Configuration.GetSection("Braintree"));

builder.Services.AddScoped<IBraintreeService, BraintreeService>();

builder.Services.AddControllersWithViews();

var app = builder.Build();

app.MapDefaultControllerRoute();
app.Run();

이제 프로젝트 전역에서 IBraintreeService를 주입 받아 사용할 수 있습니다.


6. Braintree 전용 컨트롤러 생성 (BraintreePaymentsController.cs)

Braintree 연동을 담당하는 전용 컨트롤러를 생성합니다.

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Azunt.Web.Payments.Braintree;

namespace Azunt.Web.Controllers
{
    public class BraintreePaymentsController : Controller
    {
        private readonly IBraintreeService _braintreeService;

        public BraintreePaymentsController(IBraintreeService braintreeService)
        {
            _braintreeService = braintreeService;
        }

        public async Task<IActionResult> Checkout()
        {
            var clientToken = await _braintreeService.GenerateClientTokenAsync();
            ViewBag.ClientToken = clientToken;

            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Checkout(string paymentMethodNonce, decimal amount)
        {
            var result = await _braintreeService.CreateTransactionAsync(amount, paymentMethodNonce);
            return View("Result", result);
        }
    }
}

이 컨트롤러는 다음 기능을 포함합니다.

  • Client Token 생성
  • 결제 요청 처리

7. 실행 흐름 요약

  1. 브라우저가 /BraintreePayments/Checkout을 요청합니다.
  2. 서버는 Braintree로부터 Client Token을 받아 뷰로 전달합니다.
  3. 결제 UI가 Token을 이용하여 paymentMethodNonce를 생성합니다.
  4. 서버는 POST 요청을 받아 결제 트랜잭션을 생성합니다.
  5. 결과를 화면에 표시합니다.

마무리

이 문서에서 설명한 내용은 Braintree 결제 기능을 도입하기 위한 가장 기본적인 뼈대 구조입니다. 이 구조를 기반으로 다음 기능을 쉽게 확장할 수 있습니다.

  • Drop-In UI 추가
  • Subscription Billing
  • 웹훅(Webhook) 처리
  • Multi-tenant 환경에서 PG 동적 선택 기능
더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com