Jリーグのデータを検索できるサービスを作った

# 概要
## 記事概要
今回作ったサービスの紹介をしつつ開発の流れやつまずきポイントを紹介します。
似たものを作る人の参考になれば・・・
## アプリ概要
- サッカーJリーグのデータを検索できるサービスをです。
- [こちらから検索サイトに飛べます](http://j-search.s3-website-ap-northeast-1.amazonaws.com/)
- JリーグのデータをスクレイピングするWebAPIと検索するフロント画面で構成されます。
- 現在は2017〜2019の連勝記録を調べられます。
- フロントの検索画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432257/75c40c40-3d2a-a67d-e72c-e1801585a501.png" width="150px">

# アプリ作成理由
- 川崎フロンターレというサッカーJリーグのチームのサポーターなのだが、2020年に今までの連勝記録を更新（10連勝！）をしたことをきっかけに過去のデータを調べたくなった。
- WebAPIをより理解するために自分で作りたくなった。

# 全体の構成
[フロント](https://github.com/yuta97/j-search-front)と[バック](https://github.com/yuta97/j-search)のソースコードはGitHubにあげています。
## サーバー構成図
![Jsearch-saverimage (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432257/ccec0e6f-f341-b7ae-fdc9-5c6517bca9df.png)

## ER図
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432257/d5952c62-2cc5-9a08-7df8-96b2b7decb47.png)


## 使用技術
- Python (ライブラリにFlask)
- Docker 
- MySQL
- Javascript（フロント）

# 作成の流れ＆つまづきポイント
## 流れ
1. Dockerで環境構築
2. [Jリーグのデータサイト](https://data.j-league.or.jp/SFTP01/)をスクレイピングしてDB作成
3. Flask　APIを使ってデータをWebAPIにする
4. AWSにデプロイ

## 流れの詳細 
参考にしたサイトなどを紹介しつつ開発の流れを説明します。
### 1. Dockerで環境構築
ベースはこちら([Docker内でMySQLにPythonで接続する](https://qiita.com/kenjiSpecial@github/items/63d682274ad993d69c10))を参考にしました。

```
version: "3"

services:
  mysql_db_j:
    container_name: "mysql_db_j"
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    environment: # Set up mysql database name and password
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: employees
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    networks:
      - app-tier

  python3_j:
    restart: always
    build: .
    ports:
      - '3000:3000'
      - '5000:5000'
    container_name: "python3_j"
    working_dir: "/root/"
    tty: true
    stdin_open: true
    depends_on:
      - mysql_db_j
    networks:
      - app-tier
    volumes:
      - .:/root/app/
    # command: python3 app/app.py
    command: >
      bash -c "python3 app/create_teamid.py
      && python3 app/create_result.py
      && python3 app/app.py
      "
    
networks:
  app-tier:
    driver: bridge
```

MySQLとPythonのコンテナを立ち上げて接続させています。
また。```command:```で起動時にDB作成とFlaskが起動するようにしています。

### 2. [Jリーグのデータサイト](https://data.j-league.or.jp/SFTP01/)をスクレイピングしてDB作成
スクレイピングは```requests```と```beautifulsoup```を使っています。
PythonからMySQlへの接続は```mysql-connector-python```を使いました。
ここらへんを参考に
・[Python + mysql-connector-python の使い方まとめ](https://qiita.com/valzer0/items/2f27ba98397fa7ff0d74)
・[Python3でMySQL Connectorのインストール・接続方法【快適に使う方法を紹介】](https://basicincome30.com/python3-mysql-connector)
・[公式ドキュメント](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor.html)


### 3. Flask　APIを使ってデータをWebAPIにする
FlaskAPIを使ってDBに保存したデータをJSONにして送っています。
参考
・[Flaskの簡単な使い方](https://qiita.com/zaburo/items/5091041a5afb2a7dffc8#json%E3%82%92%E8%BF%94%E3%81%99)

また、```flask_cors```を使わないと

```
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```
というようなエラーが出ます。CROS対策で必要です。

### 4. AWSにデプロイ
以下を参考にEC2にDockerをインストールしてDockerを起動させてます。ホントはECSとか使いたかった・・・
参考
・[AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法](https://qiita.com/y-do/items/e127211b32296d65803a#%E7%B5%8C%E7%B7%AF)
・[EC2でDockerコンテナを起動し、Flaskを動かす(Flaskで簡単なWebサービスを作ってみる[第5回])](http://pixelbeat.jp/build-flask-on-container-on-ec2/)

## つまづきポイント
### 設計どうすればいいの・・・
いざWebAPIを開発しようとして、「初めの一歩」の参考になる情報があまり見つからなかったですね。Restfulの原則の解説などはいろいろありますが、じゃあ実際どう作るのがスタンダードなの？ってなってしまいますね。
とりあえず今までWebAPIを利用した経験で設計してみました。

### DBが保存されてない！？
mysql-connector-pythonというライブラリでMySQLに接続していたのですが、Pythonから操作した時に、DBの追加処理をしても保存されないという問題が発生。ずっと詰まっていたのですが、[公式ドキュメント](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-commit.html)に「デフォルトではConnector / Pythonは自動コミットしないため、トランザクションストレージエンジンを使用するテーブルのデータを変更するすべてのトランザクションの後にこのメソッドを呼び出すことが重要です。」と書いてあった。ドキュメントはちゃんと読まないとね！
### AWSむずし 
フロント側をGithubPagesで公開すると以下のようなエラーが

```
index.js:30 Mixed Content: The page at 'https://yuta97.github.io/j-search-front/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://18.178.166.9:5000/continuous-records/match/win/?yearFrom=2017&yearTo=2019&continuou_recordFrom=2&continuou_recordTo=15'. This request has been blocked; the content must be served over HTTPS.
```
要はhttpsのサイトの中でhttpのAPIサーバを呼び出していることが問題のようです。
このような[混合コンテンツ](https://developer.mozilla.org/ja/docs/Web/Security/Mixed_content)は非推奨のようですね。
解決策としてEC2のAPIサーバーをSSL化使用としましたがうまく行かない・・・
苦肉の策としてS3でホスティングし、フロントをhttp通信にすることで対応。
# 感想
感想をだらだらと書きます。

- アジャイル開発みたいに小さく作って改善してくのが自分の精神衛生上大事だな。
- メディアの人は記録更新とかどうやって調べてるんだろう？何かデータベースがあるのかな？
- AWSは使いつつ慣れるしかないな。まだまだ理解が足りん。
- セキュリティももっと知りたいな。どんな攻撃があるか知らないと、対策もわからん。

# 今後の展望
今後やりたいことをだらだらと列挙していきます。

- ソート機能
- その他のデータ（連敗、負けなしとか）も検索
- セキュリティーの強化（APIkey入れるとか）
- APIテスト
- APIのドキュメント作成（swaggerでできる？）
- AWS（APIGateWay,ECS,RDS）の他のサービス利用
- SSL化
- 最新のデータを自動収集
- UIの改善（Vue.jsとか使いたい）
- CICD
- クイズ作成