SIerエンジニアが初めてのWebサイト作成〜自治会サイトのマイグレーション〜

記事の内容

SIerエンジニア(34)が初めてのWebサイト作成を行った体験録。
読んで得することはない。

経緯

社長から社長が個人で保守している自治会サイト(≠自治体サイト)のマイグレーションをしたいと飲み会で発言。
サイト自体のマイグレーションは多いに賛成するところであり、私のスキルの棚卸しとしてもチャレンジしやすい案件と思い受けた。

私のスキルセット

  • Javaプログラミング7,8年経験
  • Reactプログラミング3ヶ月経験(SIで経験できている人は少数かと)
  • 業務中、暇なときにKotlin, Haskell, Rustの勉強をしている
  • 過去にウォーターフォール全工程、その後の保守運用を経験済み

私の環境

  • 土日に軽くコーディングできるくらいの時間は取れる
  • 平日夜はコーディングほぼ不可能
  • 2020/4はニート

システム概念図

f:id:metatrading:20200503123515p:plain
システム概念図

実際の構成

サーバ

さくらのVPS
最初はさくらのレンタルサーバを借りたが、ある程度パッケージ化されたものが提供されることを知らず解約・・・。

フロント構成

フロントは、自治会員用の公開サイトと、運営者用の管理者サイトを作成した。

言語

TypeScript

パッケージマネージャ

webpack

フレームワーク

React および React Hooks

ライブラリ
ライブラリ 目的
dotenv 環境変数制御用
react-router ルーティング用
react-table テーブル表示用
material-ui cssフレームワーク
material-io cssフレームワーク
date-picker 日付選択UIライブラリ
marked マークダウン to HTML
外部サービス

firebase authentication
フロントのログイン時に利用。

エディタ

Intellij

バックエンド構成

言語

Kotlin

フロントとの通信方式

REST API

パッケージマネージャ

Gradle

フレームワーク

Spring Boot

ライブラリ
ライブラリ 目的
spring-boot-starter-web RESTエントリポイント作成
spring-boot-starter-data-jpa DBアクセス作成
flyway DBマイグレーション
firebase-admin ログイン後の認証トークン検証
de.dentrassi.crypto:pem-keystore クライアントサイドからのHTTPS通信対応用。Let's Encryptに対応する

外部サービス

firebase authentication

ログイン後、フロントからサーバサイド処理を呼び出された際の認証トークン検証。

情報共有

Stock

 メモ類の管理に使った。
 正直、機能面が弱いのとエディタの書き心地が悪かった。
 マークダウン対応していないのも微妙。
 後発にしては強みがどこなのかわからなかった。
 

Slack

 チャット。個人開発ゆえ、あまり使わなかった。
 使ったことがなかったので使ってみた感。

GitHub

 コード共有。

開発の流れ

超ざっくり要件定義

社長と会話して要件定義を図る。
当初スコープは、現行踏襲+便利機能もろもろ追加(pwaとか備品管理したいとか夢がいっぱい語られた)。

正直、細かい点をどうしたいという希望が出てこなかったので若干の不安を抱いた。
この時点では、自分自身、開発を甘く見ていたのでいろいろ夢を語った。

プロジェクト数

  • フロント(外部公開サイト)
  • 管理サイト
  • サーバサイド
  • 移行用

 現行サイトの記事の移行プロジェクト。
 記事の取り込み、マークダウンへの変換を実施。

難所

ミドルウェア全般

メールサーバ構築 困った度:★★★★★

安請け合いしたメールサーバが地獄だった。
どこかで躓くと死ねる。
反省点は、/var/log/maillogや/var/log/messagesを見てから対応するのが基本である。
コストを考えると、AWSで調達したほうがよかった気がする。
構成は
Webクライアント:Rainloop
メールソフト:postfix, dovecot

hugoインストール 困った度:★★★★★

go製のブログフレームワークであるhugoをインストール。
makeするなどの手順があり、あまり経験がなく難航した。

SSLワイルドカード証明書インストール 困った度:★★★☆☆

Let's Encriptを用いた証明書インストールでマルチドメインかつワイルドカードドメインの登録をした。
苦労したが、慣れの問題だったかな。

やったのは、Apacheへの導入、SpringBootへの導入、メールサーバへの導入などなど。

実装面

raect-table 困った度:★★★★★

Typescriptでコーディングしていたが、react-tableをTypescriptで使うには難易度が高かった。
useSortby, usePaginationなどのpluginを使う場合、型定義ファイルを差し替える必要がある。
この情報を理解するのに手間取った。
正直型定義ファイルを再作成するのは苦痛だった。

CORS 困った度:★★☆☆☆

クライアントからSpring Bootへのリクエストが延々と拒否される。
根本原因と表出したエラーがうまく噛み合っていなくて混乱した。
Webでよく見る事例を行っていれば普通は出来る。

環境別ビルド 困った度:★☆☆☆☆

webpackやSpringBootにおける環境別ビルドの制御。

レスポンシブ 困った度:★★★☆☆

cssって一つの言語レベル。。。

Spring Data JPA 困った度:★★★★★

@OneToOneの際に親側に外部キーを持たせないといけない点を知らず詰まった。

全体的に

いろいろな問題が頻発したが、複合的な問題となっているケースもあり、
過去の障害切り分けの経験が生きた。

楽しかったところ

全体像の設計

Webサイト全体のアーキテクチャから考える経験は無かったので、かなり楽しかった。
どうやって見せるか、どうやって記事を編集するか、など。

react hooks

useContextによるエラー制御やログインユーザの保持。
useStateによる状態管理。
hooksという仕組みの制限が見通しの良さをある程度要求してくれた。

簡易ブログ記述画面

プレビュー付きマークダウンエディタを用意できた。
気持ちいい。
テキストエリアにファイルをドラッグアンドドロップすると、ファイルのアップロードが行われ、
マークダウン用の参照パスがエディタ上に挿入される。

反省点

事前検討のヌルさ

さくらのレンタルサーバの仕様を正しく調査していなかった

さすがにroot権限ないのに借りるのは、ザル過ぎ。

メールサーバ構築

AWSにすればよかったと思う。

Typescriptのジェネリクス

ジェネリクスを活かしたインタフェース定義や共通化をあまり出来ていなかった。

ポエム

フロントエンド実装を伴う開発を初めて一気通貫でやってみたが、
使えるライブラリがとても多くあったし、現在進行形で日々よく出来たライブラリに出会っている。
技術のコモディティ化を身を持って体感した。
より、何を作るのか?が問われる時代が来ている。

まとめ

システム全体のライフサイクル含めて完成したときの気持ちよさはすごい。