🦁
[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(関連するセッション)
🔗 リレーション
-
Session
とFeedback
は 1: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の分離構成が、実際に手を動かすことで整理できました。
📂 リンク集
- 💻 GitHubリポジトリ:
LikeLion-Backend-Assignments/week03
🔖 タグ
#SpringBoot #Java #JPA #CRUD #バックエンド #実践記録 #LikeLion
Discussion