Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.



この記事はMERPAY TECH OPENNESS MONTHの19日目の記事です。 こんにちは。株式会社メルペイのPayment Platformチームでエンジニアをしている knsh14 です。

メルペイの様々な決済手段でどのように決済の整合性を保とうとしているかは15日目の記事で紹介しました。 メルペイでは決済の手段をもつマイクロサービス(Payment Service)と決済のための原資を管理するマイクロサービス(Balance Service)を分けています。 今回はこのお客さまの残高を正しく管理するためのマイクロサービスがいかにして正確に増減をしているかを説明します。


Introducing ViewModel Inputs/Outputs: a modern approach to MVVM architecture

This is the 18th post for MERPAY TECH OPENNESS MONTH.

Hi, I’m @celia, an iOS Engineer working at Merpay. In this article, I want to introduce how the Merpay iOS team practices MVVM architecture with viewModel Inputs/Outputs, to create an isolated, highly testable codebase.

Let me begin by explaining how we chose to use it in the first place. When native iOS development started in early 2018 at Merpay, we wanted to create a modular, well architected product that could be seamlessly integrated into the Mercari app, or provided to third parties as a service if needed. We wanted the codebase to be independent and lightweight, with minimum dependency requirement on open source frameworks. We also want it to be easy to write tests for, because we think of code and tests as one. This led us to try out viewModel Inputs/Outputs, an approach inspired by the company Kickstarter, and after working with it for a year and a half, our team is happy with it.

What It Is

The MVC architecture has been the default practice for iOS development from the beginning. As a project gets bigger, the view controller’s code gets more complex, and harder to maintain and test - a phenomenon well known as Massive View Controller. With MVVM, we add a new layer called viewModel between the model and the view controller, and move the presentation logic and data operations from the view controller into the viewModel. It reduces the complexity of the view controllers and makes the viewModel a single source of truth for the user interface state.

iOS architecture

It’s common practice to combine MVVM with a binding mechanism. Many choose functional reactive programming frameworks such as ReactiveSwift or RxSwift, but at Merpay, we minimize third-party framework dependencies as much as possible. We create our viewModel with Inputs/Outputs protocols. Why protocols you ask? Well, the protocols force the code author to reach the viewModel through Inputs and Outputs each time, thus keeping a consistent style across the entire codebase. Also they're similar to Java Interface which means we can use them to mock classes easier. Essentially, it's a lightweight way to map input and output signals to mimic binding behavior, so we can have functional programming without using binding frameworks.




メルペイiOSエンジニアの@masamichiです。 メルペイで導入している、 iOSアプリで共通UIクラスを使うための仕組みについて紹介します。


メルペイでは、メルペイの機能をSDKとして開発してメルカリアプリに組み込んでいます。SDKにはメルペイで横断的に使用する基本的なUIクラスがあります。例えばメルペイでは統一してテキストラベルの色に #000000 ではなく #333333 を使っていますが、その色を使ったUILabelのカスタムクラスをPrimaryLabelとして定義しています。他にもUIButtonでは、MercariPrimaryFilledButtonMercariSecondaryOutlinedButtonといったクラスを定義しています。



スマートグラス「nreal light」に最適化したフリマアプリ「メルカリ」の実証実験を開始

「mercari R4D」は、スマートグラス「nreal light(エンリアルライト)」に最適化した「メルカリ」の類似商品検索アプリ「Mercari Lens」のプロトタイプ版を実証実験として開発し、2019年6月27日に開催されるKDDIの法人向けイベント「KDDI 5G SUMMIT 2019」に出展します。



Google Cloud Spannerのセッションリークを静的解析で防ぐ


メルペイ エキスパートチームの@tenntennです。 @sinmetalの記事でも紹介がされていたように、メルペイではGoogle Cloud Spannerを用いて開発しています。 Google Cloud Spannerはまだまだ世界的にもノウハウが乏しい状況です。そのため、メルペイにおいても各開発者が学んだノウハウをGo Fridayなどを通して社内で共有しながら開発を進めています。

社内でノウハウを共有する中で、うっかりミスをしがちでかつそのミスによってサービスに大きく影響を与えるものがいくつか出てきました。例えば、Google Cloud Spannerのセッションを閉じ忘れることによるセッションリークの問題は、うっかりミスをしがちですがサービスに大きな影響を与えかねません。

このような問題を発見するためにzaganeというツールを開発しました。zaganeは静的解析を行い、Cloud Client Library for Goを利用している時に起こりがちなコードのミスをコミットする前に発見できます。

この記事ではzaganeで提供している機能のうちの1つである、セッションリークを発見する方法について解説します。ここで紹介するアルゴリズムはGoogle Cloud Spanner以外にも応用の効くもので、ファイルの閉じ忘れの発見などにも用いることが可能でしょう。