Web アプリ

用地情報管理サービス

不動産業界向け用地情報の保守・改修

用地情報管理サービス

Overview

プロジェクト情報

開発期間

2024.04 — 現在

クライアント

不動産会社(社内プロジェクト)

役割

フロントエンドエンジニア

チーム構成

12名(FE 3名・BE 4名・インフラ 3名・PM 1名・PO 1名)

Outline

概要

地図上に物件情報・用途地域・防災情報などをレイヤー表示し、対象区画の情報を検索・照会する BtoB 業務システムの保守・改修プロジェクト。不動産業界15社が業務で利用している。既存機能の不具合調査・修正、外部 API 連携の設計と実装、UI 改善、テスト仕様書の作成・実施、テスト自動化基盤の構築、ユーザードキュメントの整備を担当。長期的に保守しやすいコード品質を意識しながら開発に取り組んだ。

Objectives

目的・背景

開発背景

参画時点で稼働中のシステムに複数の不具合が蓄積しており、外部データの取り込みもさらなる効率化の余地があった。信頼性と使いやすさを向上させるため、段階的な改修プロジェクトのメンバーとしてアサインされた。

届けたいユーザー

不動産会社の現場担当者。用地の取得判断に必要な情報を地図上で照会する業務を支えるため、現場の業務フローに合わせた柔軟な使い勝手を重視しつつ、IT リテラシーに関わらず直感的に操作できる UI を目指した。

Key Features

主な特長

1

外部 API 連携への切り替え

社内保管していた外部の地図データを API 経由取得に移行。取り込み作業を介さず提供元のデータを参照できる構成にした。あわせて any だった既存の型定義を仕様に沿って整備し、変更箇所の影響範囲を把握しやすいコードベースに改善した。

2

外部ライブラリのバージョンアップ対応・画面統合

フォームライブラリのバージョンアップに伴い、入力項目30個を持つ画面でバリデーションのタイミングずれや入力値が反映されない不具合を調査。grep でコンポーネントを特定し、状態管理関数を使わず values オブジェクトを直接更新していた実装が原因と突き止めた。正規の API に置き換えつつ関連画面を統合し、再描画を強制する回避実装ごと不具合を根本解消した。

3

フォーム全体の再描画の抑制

React DevTools の Profiler で再描画の影響範囲を計測し、1項目の変更ごとに全項目分のオブジェクトを再生成して Context の参照を変えていることを特定。変更対象のみを更新する形に修正し、再描画を必要な範囲に限定した。

4

検索画面の機能分割と UI 改善

建物名検索と企業名検索という性質の異なる2機能が1画面に混在し、どちらを操作しているか分かりにくいという不満が上がっていた。機能単位で2画面に分割し、表示責務とロジック責務を分離して再構成。任意項目が必須項目より上に並ぶなど直感に反するレイアウトも、項目の並び順・余白・入力導線を見直してマニュアルなしで操作できる画面に改善した。参照 API 4本の差し替えも型定義の整備により実行時エラーなく完了した。

5

表示崩れの修正と優先度基準の設計

限られた工数のなか、優先度の判断基準を「その不具合で操作が完了できるか」に統一。押下範囲が狭くクリックできない、テーブル列が見切れて情報が読めないといった操作を止める不具合を高、フォントサイズの不統一などを低として整理し、起票済み3件を解消した。修正後の再起票は発生していない。

6

テスト仕様の設計・実施

新規画面・新規機能向けにテスト仕様書7件(200〜300ケース)を作成し、既存3件(約50ケース)を更新。「正しく検索されること」のような曖昧な記述を、入力条件・期待件数・表示項目・表示順といった判定可能な粒度に分解し、実施者が変わっても同じ判定になる状態にした。計10件・約500ケースを実施。

7

手動テストの Playwright 自動化(進行中)

リリースごとに約500ケース・数時間〜数十時間規模の手動確認が発生していた。ID がビルドごとに採番される、MUI のクラス名が変動する、アクセシビリティ属性が不足しているという事情でロケータ指定が困難だったため、Claude Code + Playwright MCP で POM を先に確定させ、テストコードは POM 経由のみで要素にアクセスする2段階構成を設計。20ケースの自動化に成功し、残り約480ケースへ横展開できる構造を整備した。

8

ユーザードキュメントの整備

画面の追加・変更内容を利用者が参照できるドキュメントとして整備。現場担当者が操作方法を自力で確認できる状態にした。

Tech Stack

技術スタック

ReactTypeScriptReduxRedux-SagaFormikMUITailwind CSSOpenLayersMapLibre GL JSPlaywrightClaude CodePostgreSQLC#AWS

工夫したこと

原因調査の進め方

テストコードが存在しない環境で、grep による依存関係のトレースとコンポーネント単位の目視確認で発生箇所を絞り、Profiler で再描画の影響範囲を可視化。推測ではなく計測から根本原因を特定したため、対症療法的なメモ化の追加で終わらせずに済んだ。

回避実装を暫定対応のまま残さない

再描画を強制する手動トリガーは動作してはいたが、以後の改修のたびに同種の不整合を生む構造だった。ライブラリが想定する公式 API に統一し、構造ごと解消した。

既存コードの型安全性の向上

any で定義されていた API レスポンスの型を仕様に沿って整備。型エラーによる早期検知ができる状態にし、後続の改修コストを下げた。

不具合対応の優先度の線引き

見た目の違和感ではなく「操作が完了できるか」を基準に整理。初見ユーザーの目線で全画面を通しで操作して詰まる箇所を洗い出し、限られた工数を業務影響が大きい順に配分した。この基準は以降の起票時にも適用できる形で残した。

LLM への丸投げから制約設計への切り替え

当初「仕様書を読んでテストを実装して」と指示する方式ではトークンを消費し切り、動作しないコードが生成された。モデルの能力ではなく与えるコンテキストの構造が成否を分けると判断し、仕様書の Markdown 化・POM の事前確定・POM 経由アクセスの強制という3段の制約を設計。判断が最も揺れるロケータ選定を人が確定させた POM に集約し、生成結果の再現性を確保した。

テスト観点の言語化が自動化の前提として機能した

曖昧な確認内容は、人が実施する場合も自動生成する場合も判定不能である点は同じ。手動テストの品質改善と自動化の下準備を同じ作業で兼ねる形にした。リグレッションテストを先に整備する重要性を実感した経験が、テスト仕様の言語化と自動化に取り組む判断につながった。

Next Step

今後の展望

  • 全画面のテスト自動化と CI への組み込み(現状はローカル実行のみ)
  • 地図描画などの視覚的な確認をビジュアルリグレッションテストで機械判定できるようにする
  • React のバージョンアップ