転職活動管理アプリを作ろう③（ログイン実装チュートリアル～テーブル定義）

前回は [コチラ](https://qiita.com/soso555/items/b04f0fc80956da472078)
※ 2021/09/13 時点で未完

# ログインを実装してみよう
- 以下チュートリアルを行う

https://spring.pleiades.io/guides/gs/securing-web/

- 上記チュートリアルだとインメモリにアカウントレコードを登録し、そのレコードに対し認証を行う
- MySQL を使用するように設定変更を行う
    - 設定変更をして動作確認ができるように、テーブル定義だけ先に行うことにした


# テーブル定義
- 各テーブルについて所管を記述する
- 実際のテーブル定義書については後ほど公開するかも
- __（少しずつ追記していきます）__

## アカウント情報
- テーブル名は「Account」
- ```spring-boot-starter-security``` が提供してくれるアカウント情報テーブル（＝ User テーブル）の初期スキーマは以下
    - username:String
        - ユーザー名称。DaoAuthenticationProvider に渡されて認証が行われる
    - password:String
        - パスワード。DaoAuthenticationProvider に渡されて認証が行われる
    - enabled:boolean
        - 論理削除フラグ。
    - accountNonExpired:boolean
        - アカウントの有効性フラグ。
    - credentialsNonExpired:boolean
        - 認証情報（通常はパスワード）の有効性フラグ。
        - 最近の考え方だとパスワードの頻繁な変更は脆弱とのことなので、今はあまり使わないかな？
        - パスワードを忘れた時の対処とかに流用できそう。
    - accountNonLocked:boolean
        - アカウントロックフラグ。
    - authorities:Collection<? extends GrantedAuthority>
        - 役割。
        - 一旦 String 配列で持ったあと、```createAuthorityList()``` で GrantedAuthority の List 化
        - チュートリアル中だと、```WebSecurityConfig#userDetailsService()``` の ```User.role("USER")``` で実行される

- 上記初期スキーマの内容で十分なので、このままテーブルを作成する
    - 作成日、最終更新日ぐらいは追加しておく
- ちなみに ```org.springframework.security.core.userdetails.User``` エンティティクラスを提供してくれているので、使い方は [Javadoc](https://docs.spring.io/spring-security/site/apidocs/org/springframework/security/core/userdetails/User.html) を参照
    - 実装する際には一応継承して自作クラスを使用しようね

## 役割
- DB にテーブルは作らない
    - enum 型にして静的に持つことにした
- 取り得る値は以下
    - ROLE_USER
        - 一般ユーザー
    - ROLE_ADMIN
        - 管理者
- 今の所、各役割で動作の振る舞いは変わらない。気が向いたらどこかの画面の実装で出し分けしてみる
- 役割テーブルを作って DB に格納 → アプリケーション起動時にメモリに格納 → 静的に運用、も考えたけど保持する情報が文字列だけなので不要と判断
    - 各役割ごとに実施できる機能も DB で管理するならアリ

## エージェント
- テーブル名は「Agent」
- スキーマは以下を想定
    - id:sequence
        - PK。
    - name:String
        - エージェント名称（会社名）
    - top_url:String
        - トップページURL
    - login_url:String
        - ログインURL

## エージェント担当者
- テーブル名は「AgentRecruiter」
- スキーマは以下を想定
    - id:sequence
        - PK。
    - agent_id:int
        - Agent テーブルの ID（外部キー）
    - name:String
        - 担当者名
    - email:String
        - メールアドレス

## 企業
- テーブル名は「Company」
- スキーマは以下を想定
    - id:sequence
        - PK。
    - name:String
        - 企業名称
    - corporate_url:String
        - コーポレートサイトの URL
    - recruit_url:String
        - 採用サイトの URL

## 企業の求人票
- テーブル名は「CompanyJobPosting」

## 企業のマークダウン形式メモ
- テーブル名は「CompanyMarkdown」

## 企業の評価ポイント
- テーブル名は「CompanyEvaluationStandard」

## 選考ステップ
- DB にテーブルは作らない
    - enum 型にして静的に持つことにした
- 取り得る値は以下
    - IN_BOX
        - 候補
    - SCREENING
        - 書類選考
    - PRIMARY
        - 一次選考
    - SECONDARY
        - 二次選考
    - FINAL
        - 最終選考
- 選考ステップの中に後述の「選考ステータス」を持つ

## 選考ステータス
- DB にテーブルは作らない
    - enum 型にして静的に持つことにした
- 取り得る値は以下
    - NEW
        - 新規作成
    - IN_PLANNING
        - 計画中・準備中
    - NOT_READY
        - 実施予定なし
    - WAITING
        - 待機中
    - READY
        - 準備完了
    - IN_PROGRESS
        - 実施中
    - PENDING
        - 保留中
    - REJECTED
        - 拒否
    - CANCELED
        - キャンセル
    - COMPLETED
        - 完了


# メモ
- エンティティから DDL を自動生成し実行してくれるオプション
    - spring.jpa.hibernate.ddl-auto=***
        - https://qiita.com/KenjiOtsuka/items/8450c407ba121fea8151
- エンティティから DDL を自動生成する __だけ__ のプラグイン
    - JPA Schema Generator Plugin
        - https://tosi-tech.net/2019/01/generate-mysql-ddl-from-jpa-entity-class/
        - https://github.com/Devskiller/jpa2ddl
- エンティティで使用するアノテーション一覧
    - https://qiita.com/ughirose/items/5d691adc677aa08636b8

- DB のスキーマを HTML で出力
    - https://qiita.com/nabedge/items/e9325cf214a78e378aee
- Draw.io で ER 図を描ける
    - https://qiita.com/Ooooooomin_365/items/3118c0c5fab4e100dd4f