Slide 1

Slide 1 text

Swift-OpenAPI-Generatorを 研修課題に導入してみた話

Slide 2

Slide 2 text

目次 自己紹介 Swift-OpenAPI-Generator概要と導入 新卒研修紹介 運用のTips 使用に即して苦戦したこと まとめ

Slide 3

Slide 3 text

自己紹介 👩🏼‍🚀 坂本泰成 / Taisei Sakamoto 株式会社 CyberAgent 2024年入社 TappleのiOSエンジニア _t12o_ developer-9

Slide 4

Slide 4 text

本発表で目指すこと Swift-OpenAPI-Generatorの基本的な使い方のイメージがもて る 1. 導入によるメリデメを掴める 2.

Slide 5

Slide 5 text

エンジニア新卒研修課題とは

Slide 6

Slide 6 text

エンジニア新卒研修課題とは... 3週間でクライアント、サーバー、インフラ、MLDSの メンバーでSNSアプリケーションを作り上げること

Slide 7

Slide 7 text

チームでの共通認識

Slide 8

Slide 8 text

チームでの共通認識 最新技術をなるべく使って、 人が書かなくてもいいような反復的、機械的なコードは 自動生成をフルに活用しよう

Slide 9

Slide 9 text

Swift-OpenAPI-Genetorとは...

Slide 10

Slide 10 text

Swift-OpenAPI-Genetorとは... OpenAPI仕様からSwiftのAPIクライアントコードを 生成するツール

Slide 11

Slide 11 text

Swift-OpenAPI-Generatorで何が変わるのか APIの呼び出しに要する冗長なコード最低限に留める 1. ビルド毎にコードを生成してくれるため、APIドキュ メントと擬似的な同期状態になる 2. →リポジトリにコードをコミット不要になる

Slide 12

Slide 12 text

URLSessionとの比較

Slide 13

Slide 13 text

導入について

Slide 14

Slide 14 text

導入について 扱う目的によって導入する依存関係が違う swift-openapi-generator 本体であり、コードを生成するためのロジックが入っている swift-openapi-runtime generatorから生成されたコードから使用される共通の型や抽象化を提供す る。ClientMiddlewareなどのprotocolもここに定義されている swift-oepnapi-urlsession generatorから生成されたコードをHTTP操作をするためにURLSessionに紐付 けるトランスポーター

Slide 15

Slide 15 text

導入について 他にもそれぞれの目的に応じたpackageがある

Slide 16

Slide 16 text

導入後の生成手順 1.OpenAPIのドキュメント2つを追加する openapi-generator-config.yaml openapi.yaml 2.ビルドする 生成されたコードはDerivedDataに生成される

Slide 17

Slide 17 text

BaseURL エンドポイントのパス 生成時のメソッド名 返り値のパス ↑返り値(Greeting)の情報

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

運用Tips

Slide 22

Slide 22 text

サーバーが発行するドキュメントの 最新バージョンを どうやって追従する?

Slide 23

Slide 23 text

Makefileに最新を取得するコマンドを用意する リポジトリの一時的にクローン 1. ファイルのコピー 2. 一時ディレクトリを削除 3.

Slide 24

Slide 24 text

実際にアプリで使われたコードを見ながら 苦戦したことを紹介

Slide 25

Slide 25 text

苦戦したことその① 生成されたコードの命名が不自然に冗長

Slide 26

Slide 26 text

内部ではどうなっているか Returns a Swift-safe function name for the operation. Uses the `operationID` value in the OpenAPI operation, if one was specified. Otherwise, computes a unique name from the operation’s path and HTTP method. OperationDescription.swift OpenAPI オペレーションで `operationID` が 指定されている場合は、その値を使用します。 そうでない場合は、操作のパスと HTTP メソッドから一意な名 前を計算します。

Slide 27

Slide 27 text

対策 サーバー側にoperationIdを 指定漏れがないようしてもらう get_sol_users_sol__lcub_user_id_rcub_ HTTPメソッド: get エンドポイント: /users/{user_id}

Slide 28

Slide 28 text

苦戦したことその② multipart/form-dataに 対応する

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

苦戦したことその③ Cognitoのリクエスト要件に答える HeaderにJWTを追加したい

Slide 33

Slide 33 text

対応 HeaderFieldsに 付与したい 必要情報を与える HTTPField.Name

Slide 34

Slide 34 text

HTTPField.Nameには 代表的なヘッダー名が デフォルトで いくつか用意されている カスタムでヘッダーの追加も可能

Slide 35

Slide 35 text

まとめ

Slide 36

Slide 36 text

まとめ 自動生成とはいえ、ドキュメントとの一貫性があり理解しやすい まだ実装例が少ないので細かい例外には対応可能か不安 小規模かつ短期の開発には学習コストの方が高くなり利便性が掴 めない可能性がある 長期的にみると開発効率を上げることにはつながるため、部分的の導 入を試みる

Slide 37

Slide 37 text

ありがとうございました 🥳