JSL シネマ REMASTER 🎬
単なる機能実装を超え、堅牢なエンタープライズシステムを構築した
バックエンドエンジニアとしての開発の軌跡。
Designed & Developed by
TABLE OF CONTENTS
01. プロジェクト概要 Project Overview
02. 技術スタックと設計 Tech Stack & ERD
03. コア機能:認証とUI/UX Security & User Experience
04. コア機能:マスターデータ管理 CMS & Master Data
05. コア機能:予約とトランザクション Concurrency & ACID Transaction
06. コア機能:非同期レビューと同期 Async Review & State Sync
07. トラブルシューティング Troubleshooting
08. プロジェクトを通じた成長 Conclusion & Retrospective
01. PROJECT OVERVIEW
既存のJSPベースのレガシーシステムが抱えていた、セキュリティの脆弱性と決済トランザクション管理の限界を克服するため。
単に「動くもの」を作るのではなく、日本のSI現場で求められるバックエンドの基礎体力(SQL制御・例外処理)と堅牢なアーキテクチャ設計能力を証明すること。
最新の Spring Boot 3.5.9 と MyBatis を導入し、データ整合性(ACID)を保証するシステムへと全面リファクタリング(Remaster)。
01. PROJECT OVERVIEW - Directory Structure
Spring Securityの認証フィルタおよび権限ルーティング設定と、データ転送オブジェクト(DTO)の管理。
画面遷移(View)を担当する一般コントローラーと、非同期通信(AJAX)のJSONデータを返す ApiController の分離。
コアビジネスロジックの実装階層。決済や座席予約における @Transactional を用いたデータ整合性の保証。
MyBatisインターフェースとXMLマッピングによるSQL制御。Entity層(domain)を通じたDBテーブルとの1:1マッピング。
02. TECH STACK & ER-D
コアビジネスロジックの実装に集中。
JPAに依存せずMyBatisを採用。日本のSI現場で求められる複雑なクエリの直接制御とチューニング能力を証明。
SecurityFilterChain (Lambda DSL) を適用した堅牢な認証・認可ロジックの実装。
React等に依存せず、DOM操作と非同期通信(AJAX)の原理を深く理解するため純粋なJSに固執。
コンフリクト解決やコミット履歴の管理を通じた、実務的なバージョン管理の経験。
03. CORE FEATURE: SECURITY & UI/UX
CustomUserDetails と Spring Security を用いた堅牢な認証システム。USER と ADMIN の権限を徹底的に分離し、不正なアクセスを遮断します。
ログインや会員登録時、無機質な基本アラートではなく、SweetAlert2 を用いた洗練されたトーストポップアップを導入し、ユーザー離脱率を低下させます。
課題: CUD(作成/更新/削除)処理後のリロードによるデータの二重送信。
解決: 処理後に必ずRedirectを行う PRG (Post-Redirect-Get) パターン を徹底。さらに addFlashAttribute を活用し、URLを汚さずにサーバーセッション経由で1回限りの安全なメッセージ伝達を実現しました。
認証とトーストUI デモ
04. CORE FEATURE: CMS(Content Management System) & MASTER DATA
映画のポスター画像登録時、MultipartFile インターフェースを活用。UUIDを用いてファイル名の重複を防ぎ、DBのテキストデータと物理ファイルの保存を同期させるI/Oトランザクションを実装しました。
映画(1)と上映館(1)という独立したマスターデータを結びつけ、「スケジュール(N)」を動的に生成する直感的なCMS(コンテンツ管理システム)UIを構築しました。
課題: フロントエンドの時間データ形式とDB(Java)の形式不一致。
解決: HTML5の <input type="datetime-local"> から送信されるISO 8601文字列を、Springの @DateTimeFormat を活用してJavaの LocalDateTime へシームレスにバインディング。パース例外(Parse Exception)を未然に防ぎました。
CMSデモンストレーション
05. CORE FEATURE: CONCURRENCY & ACID TRANSACTION
複数ユーザーによる同一座席への同時アクセス(オーバーブッキング)を防ぐため、DBの制約条件と分離レベル(Isolation Level)を活用したリアルタイムな座席先占ロジックを実装しました。
フロントエンドで安全に決済モジュールを呼び出し、サーバー側で検証(Validation)を行うことで、データの改ざんを防ぎ信頼性の高い決済プロセスを構築しました。
課題: 決済完了後にシステムエラーが発生した場合のデータ不整合。
解決: 「座席確保 ➔ 決済実行 ➔ ポイント減算 ➔ チケット発行」 の一連のプロセスを、Service階層で単一の @Transactional にバインド(Bind)。いずれかの段階で例外(Exception)が発生した場合は即座に完全なロールバック(Rollback)を行い、データ無欠性(Integrity)を保証しました。
予約・決済トランザクション デモ
06. CORE FEATURE: ASYNC REVIEW & STATE SYNC
Fetch APIを活用し、ページ遷移なしでレビューの作成・修正・削除が可能。修正時にはモーダルを開かず、その場で入力フォームに切り替わるインラインエディティング(Inline Editing)を実装しました。
レビュー更新の度にサーバーへ平均スコアの集計クエリを投げるのではなく、フロント側のJS reduce() 関数で計算し、DOMを直接更新する状態同期(State Synchronization)でサーバー負荷を軽減しました。
課題: フロントエンドのボタン非表示だけでは、APIの直接叩きによるデータ改ざん(IDOR攻撃)を防げない。
解決: Controller層で Spring Security の Principal.getName() から認証情報を取得し、MyBatisの WHERE userid = #{userid} 条件と結合。他人のデータを絶対に操作できないよう、バックエンドでの交差検証(Cross-validation)を徹底しました。
非同期レビュー&状態同期 デモ
07. TROUBLESHOOTING & PROBLEM SOLVING
問題: サーバー初期化時、HandlerMappingで衝突が発生し起動失敗。
原因と解決: MainController と MemberController の両方に GET /login が存在。Springの「1つのURLは1つのメソッドにマッピングされる」という鉄則に基づき、スタブ(Stub)コードを削除してルーティングを整理しました。
問題: ローカルとリモートの履歴(History)が乖離し git pull が競合(Conflict)。
原因と解決: Gitの保護メカニズムが作動したため、誤ったローカル変更を破棄。git reset --hard origin/main コマンドを使用してリモートの最新状態に強制同期させることで解決しました。
問題: CUD作業後のリダイレクトとデータ検証の困難。
解決: クエリストリングではなく addFlashAttribute で安全な1回限りのToast UI伝達を実現。エラー発生時は、View ➔ Controller ➔ DB の順でデータのライフサイクルを逆追跡し、バインディング漏れを正確にデバッグしました。
問題: 複数座席予約時、単一Stringの伝達によるMyBatis IN 句のバインディング失敗。
解決: String.split() で List<String> にパース。動的SQL(<foreach>)を活用し、要求数とロックを確保した座席数を交差検証するロジックへ改編。予約失敗率を0%へ改善しました。
08. CONCLUSION & RETROSPECTIVE
レガシーJSPからSpring Bootへの移行を通じ、MVCパターンの本質と「関心事の分離(SoC)」の重要性を体感しました。各レイヤー(Controller, Service, Mapper)の責任を明確にする設計能力を養いました。
トランザクション(ACID)制御と多層防御(Security)の実装により、企業が最も重視する「データ無欠性(Data Integrity)」を担保するロジックと、その重みを深く理解しました。
単なる勘に頼るデバッグではなく、エラーログを精緻に分析し、公式ドキュメントやフレームワークの基本原則に立ち返ってバグを根本から解決するエンジニアリングの姿勢を獲得しました。
本プロジェクトは、単なる機能実装の練習ではなく、
安定したシステムを設計・運用する
バックエンドエンジニアとしての第一歩です。
ご清聴ありがとうございました。