「ドンピシャ印刷」では、複数の帳票をストレスなく、同時に安全に処理できるように、セッション管理に「あるコレクション」を採用してこの問題を解決しました。今回は、エンジニアの皆さんが一度は頭を悩ませる「複数フォームのセッション管理」の舞台裏をご紹介します。
誰もが悩む「複数ウィンドウでのデータ競合」
Webアプリの開発において、ユーザーが入力したフォームデータを一時的にサーバー側に保持したいとき、よく使われるのが「セッションスコープ」です。 しかし、ここに単純に session.setAttribute("inputForm", formData) のように固定のキー名でデータを登録してしまうと、深刻な問題が発生します。
- タブ間での上書き: ユーザーがブラウザで「タブA」と「タブB」を開き、それぞれ別々の振替伝票を入力していたとします。キー名が同じであるため、後から開いたタブBのデータが、セッション上のデータを上書きしてしまいます。
- 不整合の発生: タブAで「保存」ボタンを押した際、裏側ではタブBのデータが処理されてしまうという、致命的なバグの原因になります。
「せっかく入力した数万円、数億円規模のデータが、隣のタブのせいで消えてしまった」 そんな悲劇は、大切な経理書類を扱うプロ向けのシステムとして、絶対に防がなければなりません。
解決策:セッションスコープに「Map」を登録する
ドンピシャ印刷では、セッションスコープにフォームオブジェクトを直接登録するのをやめ、「ウィンドウごとにキーを分けたMap(連想配列)」をセッションに登録する構造を採用しました。
具体的な仕組み
- ユニークなIDの発行: 画面(フォーム)を開くたびに、フロントエンド側で一意の「ウィンドウID(またはトークン)」をランダムに生成します。
- Mapの活用: サーバー側では、セッション内に1つの Map
を用意します。このMapのキーに先ほどの「ウィンドウID」を、値に「フォームデータ(FORM)」を格納します。 - 個別のアクセス: リクエストが送られてくるたびに、画面から送信されたウィンドウIDを元にMapからデータを取り出します。
複数ウィンドウで同時編集しても、互いに影響しない安心感
このMapによる交通整理を行うことで、驚くほどシンプルに課題が解決しました。 ユーザーが「タブAで振替伝票(テ-10)」を編集しながら、「タブBで新しく対応した請求書(テ-1023)」を入力し、さらに「タブCで見積書(ウ-306)」を修正する。 このようなヘビーなマルチタスク運用を行っても、それぞれのデータは完全に独立した空間で処理されるため、一切干渉することがありません。
最後に
プロの事務員さんが、何の不安も、何のイライラもなく「ドンピシャ」に書類を印刷してその日の仕事を終えられるように。 これからも私たちは、1行のコードに執念を込めてシステムを磨き続けていきます。 新しくなった無料ツールシリーズも、この安全な設計の上で動いています。ぜひ、安心してその手軽さを体験してみてください!