# 【サマリー】
大手美容室のOMO戦略の中核として、分断されていたEC・店舗のポイントシステムを統合するシステムを、**企画・設計・開発・インフラ構築まで責任者として単独でリードし、完遂しました。** 複雑な外部システム連携(Shopify, POS)を堅牢なアーキテクチャで実現し、ビジネスの成長基盤を構築したプロジェクトです。
-----
# 【プロジェクト概要】
全国に展開する大手美容室様の、ECサイトと実店舗のポイントシステムを統合する、OMO(Online Merges with Offline)施策の中核となるシステムを開発しました。
# サービスの価値と特徴
- **統合ポイント管理**: 店舗でのポイント獲得・使用とオンラインショップ(Shopify)でのポイント管理を一元化
- **リアルタイム同期**: 店舗とオンライン間でのポイント残高の即座な反映
- **バーコード決済**: スマートフォンでバーコードを表示し、店舗での決済に利用
- **LINE連携**: 既存のLINE公式アカウントとのシームレスな連携
- **PWA対応**: ネイティブアプリのような体験を提供するモバイルファースト設計
# 【自身の役割と担当範囲】
クライアントとの要件定義から、システム全体のアーキテクチャ設計、Ruby on Railsを用いたバックエンド開発、インフラ構築、そして運用・保守まで、**企画からリリース後までの一連のフェーズを、責任者として単独でリードし、完遂しました。**
# 【技術スタック】
- **バックエンド**: Ruby on Rails 7.2.2, Ruby 3.3.6
- **データベース**: PostgreSQL(複合インデックス、外部キー制約)
- **フロントエンド**: Tailwind CSS, DaisyUI, Vanilla JavaScript(Module Pattern)
- **インフラ**: Puma, Nginx, Conoha VPN
- **認証**: LINE LIFF SDK, Bearer Token認証
- **外部連携**: Shopify API, POSシステム連携
- **テスト**: RSpec, FactoryBot, Capybara(テストカバレッジ90%以上)
# 【具体的な行動と工夫(アピールポイント)】
## 1. ビジネスロジックの分離と整理(Interactor Pattern)
**課題**: ポイント利用時のバーコード発行やPOSからの決済確定処理は、「DBへの複数レコード記録」「外部API連携」「ポイント増減」など、複数のステップにまたがる複雑なビジネスロジックでした。
**解決策**: **`Interactor Pattern`** を採用し、一連の処理を小さなサービスオブジェクトに分割・整理しました。
```ruby
# バーコード生成の一連の処理を管理するオーガナイザー
module Barcodes
class ManageBarcodeCreation
include Interactor::Organizer
organize CreateTransactionInteractor, # トランザクション作成
GenerateBarcodeInteractor, # バーコード生成
UpdateLockedPointsInteractor, # ロックポイント更新
CreateUpdateHistoryInteractor # 履歴作成
end
end
```
**成果**:
- 各ステップの責務が明確になり、トランザクション管理によってプロセス全体の整合性を保証
- テストが書きやすく、急な仕様変更にも「慌てず」対応できる、柔軟な構造を実現できました
- 新機能追加時の影響範囲を最小限に抑制できました
## 2. 外部連携の堅牢化とセキュリティ(Service/Validator Pattern)
**課題**: Shopify、POS、LINEといった複数の外部システムとの連携は、プロジェクトの最も不安定な要素でした。また、POSからのリクエストを受け付けるAPIのセキュリティ担保も必須でした。
**解決策**: 外部連携処理を **`Service Object`** として完全に分離し、APIリクエストの検証ロジックを **`Validator`** に集約しました。
**成果**:
- POS向けAPIには **`Bearer Token認証`** を導入し、不正なアクセスを遮断
- 外部要因に強い、セキュアで再利用性の高い設計を実現
- 統一されたエラーハンドリングによる運用負荷の軽減
## 3. 保守性とパフォーマンスを両立する設計
## データベース設計の最適化
```sql
-- 複合インデックスによる検索パフォーマンス向上
CREATE INDEX idx_on_user_id_created_at_sequence_number
ON transactions (user_id, created_at, sequence_number);
-- 外部キー制約によるデータ整合性保証
ALTER TABLE transactions
ADD CONSTRAINT fk_transactions_user_id
FOREIGN KEY (user_id) REFERENCES users(id);
```
## フロントエンド設計の工夫
```javascript
// Module Patternによるコンポーネント分割
const BarcodeModule = (function() {
let isProcessing = false; // プライベート変数
return {
async initUse() { /* 初期化処理 */ },
displayBarcode(barcodeData, pageType) { /* 表示処理 */ }
};
})();
```
**成果**:
- 将来のデータ量増加を見越したパフォーマンスを確保
- コードの再利用性と保守性を大幅に向上
## 4. ユーザー体験の最適化
- **モバイルファーストのUI/UX設計**: Tailwind CSSによるレスポンシブデザインと直感的な操作フロー
- **リアルタイム同期機能**: 店舗とオンライン間でのポイント残高の即座な反映と取引履歴の詳細表示
# 【技術的な挑戦と解決】
- **ポイント整合性の保証**: ロックポイント機能、トランザクション管理、完全な監査証跡により二重使用を防止。
- **高可用性の実現**: 自動復旧機能と監視・アラート機能による早期問題検知。
- **セキュリティの強化**: 多層認証、入力値検証の徹底、セキュアなログ管理。
# 【結果・得られたこと】
## 定量的成果
- **レスポンス時間**: 平均200ms以下
- **テストカバレッジ**: 90%以上
- **バグ発生率**: 月間0.1%以下
## 定性的成果
- ステークホルダーが多い複雑なプロジェクトを、要件定義からアーキテクチャ設計、フルスタックな実装まで推進する能力を培うことができました。
- ビジネス要件を技術的ソリューションに落とし込む設計力が向上し、要件定義・設計・開発の工程を一人で「やり遂げた」ことで、技術的な自信はもちろん、ビジネスに対する責任感も格段に強くなりました。
## 技術的成長
- **アーキテクチャ設計力**: 大規模システムの設計パターン習得
- **外部連携技術**: 複数システム間の連携設計・実装能力
- **運用・保守力**: 本格的な運用環境でのシステム管理経験