Spring/실습 정리

Spring Boot 7강 - JPA 엔티티와 관계 매핑(Question & Answer 예제)

코딩하는냥이 2025. 6. 30. 15:12
반응형

JPA에서는 데이터베이스의 테이블을 클래스(엔티티)로 매핑해서
자바 객체처럼 다룰 수 있습니다.
이번 강의에서는 Question과 Answer 두 엔티티를 설계하고,
1:N(일대다) 관계를 어떻게 표현하는지 예제로 알아봅니다.


📌 예제 코드

Answer.java

package com.mysite.sbb;

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
@Entity
public class Answer {

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

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;

    @ManyToOne
    private Question question;
}

Question.java

package com.mysite.sbb;

import java.time.LocalDateTime;
import java.util.List;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Question {

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

    @Column(length = 200)
    private String subject;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;

    @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
    private List<Answer> answerList;
}

💬 코드 설명

  • @Entity
    이 클래스가 JPA에서 관리하는 테이블(엔티티)임을 명시합니다.
  • @Id, @GeneratedValue
    기본키(primary key) 지정과, 자동 증가(Identity 전략) 설정입니다.
  • @Column
    필드별로 컬럼 타입, 길이 등 세부 설정이 가능합니다.
  • Question - Answer 관계
    • @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
      한 Question이 여러 Answer를 가질 수 있음을 표현합니다.
      mappedBy는 "Answer 엔티티의 question 필드가 주인"임을 의미합니다.
      cascade = CascadeType.REMOVE는 질문(Question)이 삭제될 때,
      그에 달린 모든 답변(Answer)도 함께 삭제됩니다.
    • @ManyToOne
      각 Answer는 하나의 Question에 속합니다.
      (여러 답변이 하나의 질문에 연결)
  • LocalDateTime
    작성 일시를 저장하는 타입입니다.
  • Lombok의 @Getter, @Setter
    자동으로 getter/setter 메서드가 생성됩니다.

💡포인트 정리

  • 엔티티 클래스에는 @Entity 필수!
  • 일대다/다대일 관계
    @OneToMany, @ManyToOne 조합으로 설정
  • cascade 옵션을 활용하면,
    부모 삭제 시 자식도 자동 삭제 가능
  • 테이블 구조와 연관관계를
    객체 중심으로 명확하게 설계할 수 있다

📌정리하자면, 이번 강의에서는
실제 서비스에서 가장 많이 쓰이는
1:N(질문-답변) 엔티티 구조를 JPA로 설계해보았습니다.
관계형 데이터베이스와 객체지향 설계의 연결 고리를 이해하는 것이
앞으로의 프로젝트 개발에 매우 중요한 기반이 됩니다.