AW209: 안드로이드 페이, 메소드 카운트 비주얼라이징

Android Weekly는 매주 발행되는 안드로이드 뉴스레터입니다. 영어 기사를 정독할 시간이 없는 분을 위해 핵심 꼭지를 요약했습니다.

주간 안드로이드 뉴스를 요약해 드립니다. Android Weekly 209 원문도 읽어보세요.


안드로이드 페이 미리 보기

이번 Google I/O 2016에서 안드로이드 페이가 많은 주목을 받았습니다. 미국 외 첫 서비스 지역으로 영국에서도 서비스를 시작한다고 합니다. 안드로이드 페이를 통해 어플리케이션에서 실질적인 물품을 구매하거나 로열티카드 또는 바우처 형태로 돈을 모으실 수 있게 된 것이죠. 안타깝게도 우리나라에서는 당장 사용할 수 없지만, 국내 사용은 시간문제라는 많은 IT 전문가들의 예측에 힘입어 조만간 사용 할 수 있기를 기대합니다.

안드로이드 페이로 구매하기 (Exploring Buy with Android Pay)에서 세팅부터 구매 절차에 포함되는 중요한 컴포넌트 하나 하나 안드로이드 페이를 사용하기 위한 절차를 상세히 설명하고 있습니다. 관심있으신 분들 차근히 따라해보세요.

///build.gradle파일에 디펜던시 설정
compile 'com.google.android.gms:play-services-wallet:8.4.0'
///Manifest.xml설정
<meta-data
    android:name="com.google.android.gms.wallet.api.enabled"
    android:value="true" />
  • API 프로세스 플로우 안드로이드 페이는 클라우드 기반 페이입니다. 동작하는 방식은 모든 사용자 카드 정보를 전달하는 대신 구글이 가상 계좌 정보(Virtual Account Number)를 생성해서 판매처로 넘기게 됩니다. 그러면 판매처는 이 번호를 사용해 구매처리를 할 수 있습니다. 생성된 번호는 해당 번호가 발행된 트랜젝션에서만 사용할 수 있기 떄문에 보안 문제를 줄일 수 있습니다.

  • 안드로이드 페이 포인트! 카드 상세 정보가 아닌! 오직 가상 계좌 번호만으로 구매가 가능해짐에 따라 사용자는 상세정보를 입력하는 등의 불편함을 줄일 수 있습니다.

“보안성 향상 + 사용의 간편함 = 사용자 만족도 증가!!!”

안드로이드 페이는 사용자 뿐만 아니라 개발자에게도 편리함을 제공합니다. 안드로이드 페이는 구매 처리 과정을 모두 다뤄주며 지불 방법, 배송 장소 등의 전체 Payment Application Flow를 다뤄주기 때문이죠.
트랜잭션이 발생하면 화면 뒤에서 많은 작업들이 다뤄집니다. 아래 그림을 통해 그 절차를 이해하시면 추후 디버깅 또는 더 안정된 안드로이드 페이를 사용하는 UX를 구현하시는데 도움이 될 것입니다.

이런 개발 뉴스를 더 만나보세요

  1. 사용자가 구매를 진행하게 될 체크아웃 화면은 WalletFragment 클래스를 포함하고 있을 것입니다. BUY_BUTTON모드를 설정하는 클래스로 안드로이드 페이 버튼를 보여주고, 뒤에서는 MaskedWalletRequest를 설정합니다.

  2. 사용자가 안드로이드 페이 버튼을 누르면 어플리케이션은 MaskedWalletRequest를 안드로이드 페이 API에 보냅니다. 이때 안드로이드 API는 MaskedWallet을 실어줍니다.

  3. 그럼 onActivityResult()에서 인텐트를 받아올 수 있습니다. 이 인텐트는 MaskedWallet의 인스턴스를 포함하고 있습니다. 이 인스턴스에는 트랜젝션 데이터와 배송 정보를 포함하고요~ 주의할 점은 이 오브젝트는 지불과 관련한 어떤 정보도 포함하지 않습니다.

  4. 그 다음 사용자는 주문 확인 페이지를 보게 됩니다. SELECTION_DETAILS 모드로 설정된 WalletFragment 인스턴스가 보여지게 됩니다. 이 모드는 프래그먼트에서 사용자 상세 정보와 지불방법 빛 배송 정보를 수정할 수 있는 옵션을 제시합니다.

  5. 위 정보를 확인하고 사용자가 계속 진행할 경우 화면에 제시된 확인 버튼을 통해 구매를 확정할 수 있습니다. 이 시점에 애플리케이션은 GoogleApiClient를 사용해 API에 연결이 되어야 합니다.

  6. 성공적으로 연결되면 어플리케이션은 다음 절차로 진행됩니다.

  7. GoogleApiClient에 연결되면 PayAPI에 요청을 할 수 있고 FullWalletRequest를 작성할 수 있습니다.

  8. FullWallet 오브젝트 인스턴스는 onActivityResult()메소드를 통해 인텐트로 돌려줍니다. 이 인스턴스는 MaskedWallet오브젝트와 비슷한 정보를 담고 있으며 추가로 PaymentMethodToken인스턴스와 페이에대한 기술이 포함됩니다.

  9. FullWallet 오브젝트에 페이와 관련된 중요정보들을 담고 있으므로 우리 어플리케이션은 구매처리를 위해 이 정보를 Merchant Server로 보내면 됩니다.

  10. 마지막으로 어플리케이션은 안드로이드 페이 API에 해당 트랜젝션의 성공 여부를 알립니다. 이 시점에 우리는 사용자에게 확인 또는 에러 화면을 제시해서 그 결과를 알려줄 수 있습니다.

  • 구매 흐름 구성하기

어플리케이션 레벨에서 구매절차를 구분하면 위와 같이 구분할 수 있을텐데요, 이 처리를 위해 안드로이드 페이 API에서 제공하는 중요한 컴포넌트들을 알아보겠습니다.

  • WalletFragment Class 이 클래스는 안드로이드 페이 컴포넌트에 따른 사용자 이벤트를 처리하며 안드로이드 페이 구매 생명주기를 자동화합니다.
    • 구매 프래그먼트(Purchase Fragment):
      • 구매 버튼 제시
      • MaskedWalletRequest 설정
      • WalletFragmentMode.BUY_BUTTON모드로 초기화
    • 확인 프래그먼트(Confirmation Fragment):
      • MaskedWallet안의 상세 내용 변경 가능
      • 변경이 발생했을 때 MaskedWallet에 새로 정보 설정
      • WalletFragmentMode.SELECTION_DETAILS모드로 초기화
//코드로 WalletFragment생성 가능
WalletFragmentOptions walletFragmentOptions = WalletFragmentOptions.newBuilder()
        // set other WalletFragmentOptions
        .setMode(WalletFragmentMode.BUY_BUTTON)
        .build();

WalletFragment walletFragment = WalletFragment.newInstance(walletFragmentOptions);
//xml사용 시
<fragment
    android:name="com.google.android.gms.wallet.fragment.WalletFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    wallet:fragmentMode="buyButton"/>

이 외에 WalletFragmentOptions, WalletFragmentStyle에 대한 자세한 내용은 원문을 참고해주세요.

  • 안드로이드 페이 사용이 가능한지 확인 사용자에게 안드로이드 페이 트렌젝션을 실행하기 위한 옵션을 제공하기 전에 해당 서비스가 사용가능한 상태인지 확인하는 것이 좋습니다!
Wallet.Payments.isReadyToPay(mGoogleApiClient).setResultCallback(
        new ResultCallback<BooleanResult>() {
            @Override
            public void onResult(@NonNull BooleanResult payEnabled) {
                if (payEnabled.getStatus().isSuccess()) {
                    if (payEnabled.getValue()) {
                        // 오! 안드로이드 페이를 사용할 수 있습니다.
                        // Android Pay 버튼을 보여주고 표준체크아웃 버튼을 숨깁니다!
                    } else {
                        // 해당 사용자는 Android Pay 사용이 안되네요ㅠ
                        // 안드로이드 페이 버튼 대신 표준 버튼을 제시해줍니다.
                    }
                } else {
                    // `isReadyPay()`요청 중 에러가 발생한 것 같아요...
                }
            }
        });

  • Masked Wallet Request 생성하기 Masked Wallet 오브젝트는 Merchant Transaction ID 와 배송, 지불 정보를 포함합니다. 사용자가 ‘Buy with Android Pay’버튼을 누르면 이 오브젝트를 꺼낼 수 있습니다. 이 단계에서 배송 주소, 연락처 등 속성을 설정할 수 있습니다. 이 부분과 토큰 요청 관련 내용은 원문을 참고해주세요.
MaskedWalletRequest request = MaskedWalletRequest.newBuilder()
        .setMerchantName(MERCHANT_NAME)
        .setPhoneNumberRequired(true)
        .setShippingAddressRequired(true)
        .setCurrencyCode(Constants.CURRENCY_CODE_GBP)
        .setEstimatedTotalPrice(cartTotal)
        .setCart(Cart.newBuilder()
                .setCurrencyCode(Constants.CURRENCY_CODE_USD)
                .setTotalPrice(cartTotal)
                .setLineItems(lineItems)
                .build())
        .setPaymentMethodTokenizationParameters(parameters)
        .build();
  • Masked Wallet 요청하기 onActivityResult()로 넘어온 MaskedWallet을 꺼내면 구매를 확정하기 위한 준비가 다 되었습니다!

  • 구매 확정하기

WalletFragmentOptions walletFragmentOptions = WalletFragmentOptions.newBuilder()
        .setEnvironment(Constants.WALLET_ENVIRONMENT)
        .setFragmentStyle(walletFragmentStyle)
        .setTheme(WalletConstants.THEME_LIGHT)
        .setMode(WalletFragmentMode.SELECTION_DETAILS)
        .build();
mWalletFragment = SupportWalletFragment.newInstance(walletFragmentOptions);
  • FullWallet 요청 및 추출하기 FullWallet은 트랜잭션 Id와 사용자의 쇼핑 카트에 대한 상세 정보를 담고 있습니다. 통화코드와 총 가격, 구매 물품 내역을 포함합니다. 토큰 추출 방법은 원문을 참고해주세요.
FullWalletRequest request = FullWalletRequest.newBuilder()
        .setGoogleTransactionId(googleTransactionId)
        .setCart(Cart.newBuilder()
                .setCurrencyCode(Constants.CURRENCY_CODE_GBP)
                .setTotalPrice(cartTotal)
                .setLineItems(lineItems)
                .build())
        .build();
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
        .enableAutoManage(fragmentActivity, mOnConnectionFailedListener)
        .setAccountName(accountName)
        .addApi(Wallet.API, new Wallet.WalletOptions.Builder()
                .setEnvironment(Constants.WALLET_ENVIRONMENT)
                .setTheme(WalletConstants.THEME_LIGHT)
                .build())
        .build();
Wallet.Payments.loadFullWallet(mGoogleApiClient, fullWalletRequest,
        REQUEST_CODE_RESOLVE_LOAD_FULL_WALLET);
  • 에러 코드 내용
    • ERROR_CODE_AUTHENTICATION_FAILURE
    • ERROR_CODE_BUYER_ACCOUNT_ERROR 등 자세한 내용은 원문을 참고해주세요 :)

지금까지 안드로이드 페이와 관련된 전체 과정을 간단히 살펴보았습니다. 참고로 이 요약 정리에서 다루지 않았지만 안드로이드 페이 구매 버튼의 스타일링도 가능합니다. 더 자세한 내용은 안드로이드 페이로 구매하기 (Exploring Buy with Android Pay)에서 확인해주세요!

비주얼라이즈를 이용한 메소드 개수 확인하기

Dexcount Gradle Plugin을 사용하면 쉽고, 또 보기 좋에 메소드 개수를 확인할 수 있습니다.

// root build.gradle file에 추가 하세요
buildscript {
    repositories {
        jcenter() // or mavenCentral()
    }

    dependencies {
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.0'
    }
}
// app build.gradle file (Android plugin 이후에 적용하세요)
apply plugin: 'com.getkeepsafe.dexcount'
./gradlew assembleDebug

그리고 나서 위 처럼 실행하시면 콘솔에 메소드 카운트가 제시됩니다. 그리고 build/outputs/dexcount/debugChart에서 인터렉션이 가능한 그래픽 리포트를 생성하세요. 아래와 같은 결과를 얻으실 수 있습니다.

커서를 옮기면서 어떤 라이브러리가 용량을 얼마나 차지하고 있는지 등 쉽게 확인하실 수 있습니다. 이를 활용해 메소드 개수를 줄이는 방법 - 적합한 라이브러리 선택하기 또는 라이브러리 대체하기 등의 내용은 효율적으로 메소드 줄이기 (EFFICIENTLY REDUCING YOUR METHOD COUNT)를 참고해주세요.

이번주의 오픈소스 라이브러리

  • HorizontalWheelView 아래와 같이 수평 휠 컨트롤러를 제공하는 라이브러리입니다.

  • sensey 제스처 디텍션을 지원하는 라이브러리입니다.

  • easydeviceinfo 손쉽게 디바이스 정보를 가져올 수 있는 간단한 라이브러리입니다.

더 읽을 거리

6월 셋째 주의 기사를 Android Weekly 209 영어 원문에서 볼 수 있습니다.

지난 뉴스가 궁금하다면 아래 링크를 참고해 주세요.

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.


Realm Korea

Realm Korea Team

4 design patterns for a RESTless mobile integration »

close