01/ 052026年10月〜11月
Yoyū
余裕(よゆう)
日本で学ぶ留学生のための、アルバイト時間管理アプリ。
フルスタック ・ バックエンド
無料枠のため、初回表示に約40秒かかります。
(新しいタブで開きます)

課題
日本の留学生は、すべてのアルバイトを合算して「連続する7日間で28時間以内」しか働けません。雇用主は自分の職場の勤務時間しか把握していないため、合計を管理できるのは本人だけです。
実装したもの
英語・日本語対応の、インストール可能な PWA です。フレームワークに依存しない純粋な Java のルールエンジンが、すべての7日間ウィンドウ、日付をまたぐシフト、長期休暇中の上限を判定し、Spring Boot の REST API として提供します。シフトの重複は PostgreSQL 自体が拒否します。
技術的なポイント
- データベースで整合性を保証:GiST 排他制約でシフトの重複を防止。ユーザー単位の行ロック、楽観ロック、冪等キーにより、同時書き込みやリトライでも一貫性を維持。
- Spring Security による Google・LINE ログイン(OAuth 2.0 / OpenID Connect、PKCE)。メール認証コードは HMAC でハッシュ化し、CSRF 対策とレート制限も実装。
- シフト表の取り込みは端末内で完結:PDF.js と Tesseract.js(OCR)をブラウザ上で実行し、取り込んだデータは一括で保存(全件成功か全件失敗)。
- 無料枠(Azure App Service と Neon PostgreSQL)で運用しているため、アイドル後の初回表示には約40秒かかります。
- REST エンドポイント
- 42
- Flyway マイグレーション
- 10
- バックエンドテスト(JUnit 5、Testcontainers)
- 511
- フロントエンドテスト(Vitest)
- 537
使用技術
処理の流れ
- React PWA
- Spring Security:セッション、CSRF、OIDC
- REST コントローラとバリデーション
- サービス層:ユーザーロック、冪等性
- 純粋な Java のルールエンジン
- PostgreSQL:GiST 排他制約
制約と注意点
- 個人プロジェクトで、実ユーザーはいません。
- デプロイは手動で、自動化したブラウザ E2E テストはありません。
- 現行のソースコードは非公開リポジトリにあるため、リンクは稼働中のアプリのみです。







