Spring Bootを活用したオンライン学習プラットフォームの設計と実装

システム概要

本システムは、教育機関や個人向けに構築されたWebベースの学習管理プラットフォームで、Spring Bootをバックエンドフレームワークとして採用し、MySQLによるデータ永続化を実現しています。フロントエンドとバックエンドを明確に分離した3層アーキテクチャにより、保守性と拡張性を両立しています。

主要機能スクリーンショット

(※ 実際のデモ画像や動画は省略)

認証・ユーザー管理の核心コード例

@RestController
@RequestMapping("/auth")
public class AuthController {

    @Autowired
    private LearnerService learnerService;

    @Autowired
    private JwtTokenProvider jwtProvider;

    @PostMapping("/signin")
    public ResponseEntity<AuthResponse> authenticate(@RequestBody LoginRequest req) {
        LearnerEntity learner = learnerService.findByAccount(req.getAccount());
        
        if (learner == null || !learner.getPassword().equals(req.getPassword())) {
            return ResponseEntity.badRequest().body(new AuthResponse("認証失敗"));
        }
        
        if (!learner.getAuthority().equals(req.getRole())) {
            return ResponseEntity.status(403).body(new AuthResponse("権限不正"));
        }

        String accessToken = jwtProvider.createToken(learner.getId(), learner.getAccount(), learner.getAuthority());
        return ResponseEntity.ok(new AuthResponse("認証成功", accessToken));
    }

    @PostMapping("/signup")
    public ResponseEntity<ApiResponse> register(@RequestBody LearnerEntity learner) {
        if (learnerService.existsByAccount(learner.getAccount())) {
            return ResponseEntity.badRequest().body(new ApiResponse(false, "既に登録済みのアカウントです"));
        }
        learnerService.save(learner);
        return ResponseEntity.ok(new ApiResponse(true, "登録完了"));
    }

    @GetMapping("/signout")
    public ResponseEntity<ApiResponse> logout(HttpServletRequest req) {
        req.getSession().invalidate();
        return ResponseEntity.ok(new ApiResponse(true, "正常にログアウトしました"));
    }

    @PutMapping("/profile/{id}")
    public ResponseEntity<ApiResponse> updateProfile(@PathVariable Long id, @RequestBody LearnerEntity updated) {
        learnerService.updateById(id, updated);
        return ResponseEntity.ok(new ApiResponse(true, "プロフィールを更新しました"));
    }
}

データベーススキーマ定義

CREATE TABLE IF NOT EXISTS `learners` (
  `learner_id` BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '学習者ID',
  `account` VARCHAR(64) NOT NULL UNIQUE COMMENT 'ログインアカウント',
  `credential` VARCHAR(128) NOT NULL COMMENT 'パスワードハッシュ',
  `authority` ENUM('STUDENT', 'INSTRUCTOR', 'ADMIN') DEFAULT 'STUDENT' COMMENT '権限レベル',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '登録日時',
  INDEX idx_account (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `learners` (`account`, `credential`, `authority`) 
VALUES ('admin', 'hashed_admin_pass', 'ADMIN');

技術スタック解説

Javaプラットフォーム

Javaはオブジェクト指向を基盤とした汎用プログラミング言語であり、JVM上で動作することでクロスプラットフォーム性を実現します。特にSpring Frameworkとの親和性が高く、DI(依存性注入)やAOP(アスペクト指向プログラミング)といったエンタープライズ開発に不可欠な機能を自然に統合できます。また、豊富なライブラリ群と成熟したエコシステムにより、大規模アプリケーションの開発・保守が容易です。

MySQLデータベース

MySQLはACID特性をサポートするリレーショナルデータベース管理システム(RDBMS)で、トランザクション処理や複雑なクエリにも対応可能です。InnoDBストレージエンジンを標準採用しており、行レベルロックや外部キー制約、クラッシュリカバリ機能を備えています。さらに、接続プーリングやレプリケーション機能により高可用性システムの構築も可能で、教育系システムから金融系まで幅広い用途に適しています。

この実装の特徴

コードベースはClean Architectureの原則に則っており、ビジネスロジックとインフラストラクチャ層を明確に分離。JWTトークンによるステートレス認証を採用し、セッション管理の負荷を軽減。データアクセス層ではMyBatis-Plusを活用し、冗長なSQL記述を最小限に抑えつつ柔軟なクエリ構築を実現しています。

タグ: SpringBoot MySQL JWT Java RESTAPI

7月1日 17:33 投稿