Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DeSCヘルスケアにおけるGo 活用事例紹介 #DeNAgo
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kurikei
July 18, 2019
Programming
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DeSCヘルスケアにおけるGo 活用事例紹介 #DeNAgo
DeSCヘルスケアでのGoの活用事例の紹介になります
kurikei
July 18, 2019
More Decks by kurikei
See All by kurikei
GoogleAppEngineのマルチテナント機能の活用事例
kurikei
0
72
Other Decks in Programming
See All in Programming
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.4k
ふつうのFeature Flag実践入門
irof
8
4.1k
Performance Engineering for Everyone
elenatanasoiu
0
200
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
190
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
130
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
スマートグラスで並列バイブコーディング
hyshu
0
250
Inside Stream API
skrb
1
750
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
170
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
さぁV100、メモリをお食べ・・・
nilpe
0
150
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
860
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
Paper Plane
katiecoart
PRO
1
52k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
Practical Orchestrator
shlominoach
191
11k
From π to Pie charts
rasagy
0
220
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
GitHub's CSS Performance
jonrohan
1033
470k
Google's AI Overviews - The New Search
badams
0
1k
Transcript
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. Copyright (C)
2018 DeNA Co.,Ltd. All Rights Reserved. DeSCヘルスケアにおけるGo 活用事例の紹介 DeNA.go #2 July 18, 2019 栗田佳祐 DeSC Healthcare Inc. && DeNA Life Science Inc. 1
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 自己紹介 ▪
栗田佳祐 ▪ サーバーサイドエンジニア ▪ 2012〜2015:ブラウザゲーム ▪ 2015〜現在:DeSCヘルスケア ⁃ 2015.10-2017.10:KenCoM (後述) のサービス開発 ⁃ 現在:利用することでユーザーの健康を促進する新規サービスを開発中 ▪ @kurikei 2
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. アジェンダ ▪
自己紹介 ▪ ヘルスケア事業部の紹介 ⁃ ミッション ⁃ サービス ▪ アーキテクチャとディレクトリ構成 ▪ レイヤードアーキテクチャとDIの利用ケースの紹介 ▪ 暗号化の手法と透過的に行うための仕組みの紹介 3
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. ヘルスケア事業部のミッション 4
https://healthcare.dena.com/
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. ヘルスケアのサービス紹介 5
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 技術概要 ▪
これらのサービスを利用している前提でお話します ⁃ Google Cloud Platform • Google App Engine(GAE) ⁃ Go 1.11 • Cloud Firestore • Cloud Functions ⁃ Firestoreの作成/更新イベントをトリガーして非同期処理を行う ⁃ CircleCI ⁃ OpenAPI 3 6
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. アーキテクチャとディレクトリ構成 ▪
レイヤードアーキテクチャ(+DIP)を採用 ▪ ディレクトリ構成 src/app └ application └ domain │└ user │ └ user.go │ └ repository.go └ infrastructure │└ firestore │ └ user_repository.go └ interface │ └config・・・設定の定数など └ lib ・・・どのレイヤーからも呼ばれる処理(ログなど) 7 infrastructure domain application interface レイヤーの依存関係
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. ▪ レイヤードアーキテクチャとDIの利用ケースの紹介
8
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. domainでインターフェイスを定義し、infrastructure層の具体的実装をDI 9
domainではインターフェイスを定義 ・infrastructure/firestore/user_repository.go ・di.go ・domain/user/repository.go infrastructureでは具体的な処理を記載
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 変更が見込まれるライブラリもDIで差し替え可能な状態にしておく ▪
GoogleAppEngine/Go 1.12では appengine パッケージが利用不可になる ⁃ 代替コストの大きいものは引き続きappengineパッケージを利用しつつも、いつでも差し替えられる準 備はしておく 10 抽象層を定義 具体的な実装(変更の可能性のあるパッケージに依存) DI を行う。具体的な実装が変わる場合はここで差し替える
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. ▪ 暗号化の手法と透過的に行うための仕組みの紹介
11
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. レイヤードアーキテクチャ(+DI)を採用するメリット ▪
レイヤードアーキテクチャを採用することでメリットは大きい ⁃ 関心事が分離できる ⁃ レイヤーごとに変更のライフサイクルは異なる • domain層はしばしば機能要件によって変わる • infrastructure層は外部要因によって変更を余儀なくされる ⁃ あるレイヤーの変更時に別のレイヤーの変更がいらなくなる 12
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. レイヤードアーキテクチャを採用する際の課題と向き合う ▪
一方で、シンプルなAPIの実装でもコード差分が大きくなりやすい ⁃ どうしても各レイヤーで関数を定義する必要がある ⁃ コード差分が大きくなると必然的に書くテストが増える ▪ gomock を利用してテスト中ではmockをDIすることで、レイヤーの最小限の責務のみテ ストを書く ⁃ DBにデータからデータが取得できる/正しく保存されてるかはテストするのはinfrastructure層のみ ⁃ その他のレイヤーは主に下記のテストする • interface層・・・レスポンスコードやレスポンス形式のみテスト • application層・・・ドメインが返すエラーに応じて、interfaceそうに適切なエラーを伝播させる • domain層・・・ドメインロジックそのもののテスト ▪ gotests コマンドでテストの雛形生成 13
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 透過的な処理を行うメソッドを挟み込む ▪
DBの取得時/保存時に透過的に処理を行う関数を挟む ⁃ Google Cloud Datastoreを利用している人には PropertyLoadSaver がおなじみ ⁃ 個人情報の暗号化/復号/タイムスタンプの更新 などをドメイン層からは意識せず確実に行う • 社内のセキュリティ規定を満たすために個人情報はカラム暗号化も行う • 暗号化にはエンベロープ暗号(後述)を用いている 14
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 透過的な処理を行うメソッドを挟み込む 15
infrastructure層にEntityを定義 取得時に インフラ層のEntityに castする 基底メソッドはEntityインターフェイス を満たす引数を取り、取得時は LoadPropertiesを必ず呼ぶ (この中でデータの復号を行う)
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. エンベロープ暗号化の採用 ▪
セキュリティポリシーにより(データベースの暗号化とは別に)カラムの値の暗号化が必 要 ▪ 鍵管理にはKMSを利用 ▪ すべての値に対してKMSで復号すると、問い合わせに時間がかかる ▪ エンベロープ暗号の手法を用いる ⁃ Key Encryption Key(KEK)は KMSで管理し、アプリの初期化時にメモリ上にのみロード ⁃ 保存時(暗号化) i. カラムごとにData Encryption Key(DEK)を作成 ii. データをDEKを用いて暗号化 iii. メモリ上のKEKを用いてDEKも暗号化し、iiのデータと共に保存 ⁃ 取得時(復号) i. KEKによって暗号化されたDEKを復号 ii. 複合されたDEKを用いて、データを復号 16 エンベロープ暗号化 https://cloud.google.com/kms/docs/envelope-encryption?hl=ja#balancing_deks_and_keks
Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. まとめ ▪
レイヤードアーキテクチャとDIを利用することで変更に強い構成にする ▪ レイヤードアーキテクチャを採用することでどうしても書かざるを得ないテストはmockや 自動生成を利用することで早くかけるようにする ▪ 守らないといけない情報は確実にまもりつつ、パフォーマンスと両立させる 17