プログラムを書けないSIerのなんちゃってエンジニアがpythonとSwiftでクーポン配信サービスを作ってみた

 この記事は普段PPTとExcelの仕事ばかりでプログラムを書けないSIerのなんちゃってエンジニア「うらー」が、本とネットの情報を駆使してRESTful なAPIとswiftでiPhone向けのクーポン配信サービスを開発した記録です。開発を始めたきっかけから、APIとアプリの仕様、具体的な手順まで公開しています。

開発を始めたきっかけ

 一番の理由は自分の立場に罪悪感を感じた事。自分はアジャイル開発が専門分野ですが導入コンサル的なポジションなので実装に関わる機会がすごく減っています。にも関わらず立場上「こう設計すべき」「こう実装すべき」と言わなければならず、だんだん教える立場の自分が未経験の事を開発者に「やれ」という機会が増え、罪悪感を感じるようになりました。やった事も無い人間に偉そうに「やれ」と言われたら嫌ですよね。その時に関わっていた案件がpythonでRestAPIを開発していたので、自分でも一通り実装できるようになっておこうと思いました。

 二つ目の理由は自分の立場に危機感を感じた事。前述の通りアジャイル開発のコンサル的な役割で実装を担当する事はありません(というか担当させてもらえない)。これはSIerならではです。ユーザ系企業だとアジャイルを知っている開発者が開発しながら周りに教えたり、全社のエバンジェリストを兼務するケースが普通だと思います。すると自分はアジャイルに取組んでいるSIerでしか必要ないニッチな人材という事になります。もし会社がアジャイルの取組みを止めたりアジャイルが一般に定着してコンサル的な役割が必要なくなった時、悲しい事になります。なので実装も分かるようにしておかないとヤバいと思いました。

クーポン配信サービスについて

 居酒屋のクーポンを配信するAPIと、APIから取得したクーポン情報をiPhoneに表示するアプリを作ります。APIはpythonで開発してクラウドで公開できるところまで作ります。アプリはswiftで開発します。それぞれの機能とシステム構成を簡単に説明します。

APIの機能

  • APIはクーポンのタイトル、割引特典、説明、利用可能店舗、利用可能期間、クーポンの画像などを配信する
  • APIはリクエストパラメータを指定する事でレスポンスする情報のフィルタができる
  • APIはトークン認証によってクーポン情報を新規投稿、変更、削除できる
  • レスポンスはJson
クーポンデータのイメージ

APIのシステム構成

 クラウドで公開する際の最終形は下記の構成になります。

アプリの機能

  • アプリはAPIで取得した1つ以上のクーポン情報を画面に表示する
アプリのイメージ

開発の手順

 調べて試しながらの開発でしたので、かなり回り道な手順となっています。自分のPC(Mac)に開発環境を作るところからスタートします。各作業ごとの細かい手順 はQiitaに投稿しているので、そちらを参考に進めて頂くとご自身の環境でも同じようなアプリを作る事が出来ると思います。

 手順に加えて開発したコードをGitHubで公開しています。リンクを手順の後ろに貼っておきます。

APIを開発をするための準備をする

no.作業手順メモ
1Pythonを開発マシンにインストール(アップデート)MacのPythonを2系から3系にアップデートする
2エディターをインストール
※自分はVSCodeを選びました
3Pythonで簡単なプログラムを書いて動かしてみるPythonのプログラムをとりあえず書いて動かしてみる
4Djangoのインストールpipenvの仮想環境にDjangoをインストールする
5Djangoの環境でpythonのプログラムを動かしてみるpipenvで作ったDjangoの環境でpythonを動かしてみる

VSCodeでpythonを書く場合はpython用の拡張機能のインストールをお薦めします。手順は下記の通り

VSCodeの左のメニューのExtensionsを開いて、検索ボックス(Search Extensions in Marketplace)にPython と入力。Python用の拡張機能を検索します。Pythonに関連する拡張機能の一覧が表示されます。

リストから、Python を選択して、緑色のインストールボタンを押してインストールします。

とりあえずJSONでレスポンスするAPIを作ってみる

.no作業手順メモ
6簡単なAPIを作ってみる(初心者向け)DjangoでシンプルなwebAPIを作ってみる
7Djangoのテンプレート機能を使ってみる
※これはAPIを作る目的からすると不要だが、勉強として実施した。
Djangoのテンプレート機能を使ってみる
8gitでコードを管理する方法を覚える(初心者向け)コードをgitで管理する方法 gitのインストールから〜
96で作ったAPIをJSON形式でレスポンスするように改造する【Python/Django】JSON形式でレスポンスをするwebAPIを作成する

クーポンを表示する必要最小限のiPhoneアプリを開発する

no.作業手順メモ
10APIで取得したクーポンの情報をアプリが取り出せるようにするswiftでwebAPIを呼び出してjsonデータを表示させる
11取り出したクーポンの情報の中から必要最低限の情報を画面に表示出来るようにするAPIで取得したデータをswiftのTableViewに表示する

データベースで管理されたクーポン情報を配信できるようにする

 ここまでで作成したAPIはクーポンの情報をコードに直接書いていましたが、クーポンの情報を追加したり編集したり削除するのに都度コードに手を加えなくてはならず実用的ではありません。データベースで管理できるように改修します。

no.作業手順メモ
12Djangoの機能を使ってクーポンの情報をデータベースで管理できるように改造する。DBに格納したデータを返すwebAPIをDjangoとSQLiteで開発する

iPhoneアプリのアップデート

 12の改修でAPIがレスポンスする情報とJSONのかたちが変わったのでアプリ側を対応させます。加えてクーポンの説明や対象店舗などの情報も表示できるようにします。

no.作業手順メモ
13改修後のAPIがレスポンスするJSONからデータを取得できるようにアプリを修正するswiftで配列型のJSONから値を取り出す
14クーポンの説明や対象店舗などの情報も表示できるように、一覧表示のデザインを変更するSwiftのTableViewCellを使ってTableViewを自由にカスタマイズ

RestFullなAPIに改造する

 ここから今回の本命のRest形式のAPIになるよう改造します。DjangoはDjango Rest Framework というフレームワークを導入することで簡単にRestFullなAPIが開発できます。Rest化させた上で、クーポン情報のフィルタリングや認証など、実運用で想定される機能も実装します。

no.作業手順メモ
15Django Rest Frameworkを導入してAPIをRest化するDjango Rest Framework で RESTful な APIを作成する
16Django Filterを導入して、リクエストで指定されたデータと一致するクーポンのみレスポンスできるようにする。Django Rest Framework で 特定のデータだけレスポンスするようにフィルタを設定する
17リクエストで指定された日付よりも有効期限が後のクーポンのみレスポンスできるようにオリジナルのフィルタを作る【Django Rest Framework】Django-Filterを使ってフィルタ機能をカスタマイズする
18POST,PUT,DELETEのリクエストに対してトークン認証を設定し、データを守る。Django Rest Framework で JWTによるAPIの認証機能を実装
19クーポンの画像を配信できるようにするDjangoで画像を配信できるwebAPIを作る

クーポンの画像をアプリに表示できるようにする

no.作業手順メモ
20APIで取得したクーポンの画像をiPhoneのアプリで表示できるようにする。
【Swift】TableViewCellにImageViewを追加してURLで指定された画像を表示する

パブリッククラウドでAPIを公開する

no.作業手順メモ
21クラウドにAPIを公開するための環境を構築するAWS Amazon Linux2 で Django 2.2以降の環境を構築する
22クラウドの環境にAPIをデプロイするnginx、uWSGI、Djangoの構成でEC2にアプリケーションをデプロイする

 以上でAPIとアプリは一旦完成という事にしました。次は作ったサービスを居酒屋の店長に見せて感想をもらおうと思っていますが、新型コロナの関係で店が休業中のため、5月以降になりそうです。

 今回の開発をきっかけにAPIとアプリを組み合わせたサービスの作り方が多少理解できたので、引き続きもっと面白いものを作りつつ未経験の技術にもチャレンジしていこうと思います。

 最後に、開発したコードはGitHubで入手いただけます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です