🦁

[LikeLion Backend] Week 3|Spring Bootで1:NリレーションのCRUD APIを実装してみた

に公開

🏁 はじめに

LikeLionバックエンドコース第3週の課題として、
勉強セッション(Session)とGPTフィードバック(Feedback)」のドメインを設計し、1:Nのリレーション関係を持つCRUD APIをSpring Bootで実装してみました。

今回の課題では、ドメイン設計・JPAによるリレーション構築・RESTful APIの設計といったバックエンド開発の基本的なスキルを実践的に学びました。


🧩 使用技術スタック

  • Java 17
  • Spring Boot 3.x
  • Spring Data JPA
  • MySQL
  • Lombok
  • Postman

🧱 ドメイン設計

今回設計したドメインは以下の通りです:

📘 Session(勉強セッション)

  • subject(学習テーマ)
  • duration(学習時間)
  • completedAt(完了日時)

💬 Feedback(GPTフィードバック)

  • message(AIからの感想/アドバイス)
  • createdAt(生成日時)
  • sessionId(関連するセッション)

🔗 リレーション

  • SessionFeedback1:N の関係
    → 1つのセッションに対して複数のフィードバックを紐づけることが可能です。

🧑‍💻 実装コード例

✅ 1. Entityのリレーション設定

@Entity
public class Feedback {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String message;

    private LocalDateTime createdAt;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "session_id")
    private Session session;

    // ... constructor, getter, builder など
}

@ManyToOne(fetch = FetchType.LAZY) により、必要なときだけSessionを読み込むようにしています。

✅ 2. fetch joinを用いたN+1問題の最適化

@Query("SELECT f FROM Feedback f JOIN FETCH f.session")
List<Feedback> findAllWithSession();

🔄 実装したAPI一覧

メソッド エンドポイント 説明
POST /sessions セッションの登録
GET /sessions セッション全件取得
GET /sessions/{id} 特定セッション取得
POST /feedbacks フィードバックの登録(sessionId指定)
GET /feedbacks フィードバック全件取得
GET /feedbacks/session/{id} セッションごとのフィードバック取得

🧠 学びと感想

  • JPAによるエンティティ間のリレーション設計を自分で実装し、概念理解が一気に深まりました。
  • N+1問題の原因と解決方法(fetch join)の実体験はとても貴重でした。
  • Controller/Service/Repository/DTOの分離構成が、実際に手を動かすことで整理できました。

📂 リンク集


🔖 タグ

#SpringBoot #Java #JPA #CRUD #バックエンド #実践記録 #LikeLion

Discussion