반응형
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에 속합니다.
(여러 답변이 하나의 질문에 연결)
- @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
- LocalDateTime
작성 일시를 저장하는 타입입니다. - Lombok의 @Getter, @Setter
자동으로 getter/setter 메서드가 생성됩니다.
💡포인트 정리
- 엔티티 클래스에는 @Entity 필수!
- 일대다/다대일 관계는
@OneToMany, @ManyToOne 조합으로 설정 - cascade 옵션을 활용하면,
부모 삭제 시 자식도 자동 삭제 가능 - 테이블 구조와 연관관계를
객체 중심으로 명확하게 설계할 수 있다
📌정리하자면, 이번 강의에서는
실제 서비스에서 가장 많이 쓰이는
1:N(질문-답변) 엔티티 구조를 JPA로 설계해보았습니다.
관계형 데이터베이스와 객체지향 설계의 연결 고리를 이해하는 것이
앞으로의 프로젝트 개발에 매우 중요한 기반이 됩니다.
'Spring > 실습 정리' 카테고리의 다른 글
Spring Boot 10강 - Thymeleaf로 질문 목록 테이블 출력하기 (0) | 2025.07.02 |
---|---|
Spring Boot 9강 - Service 계층과 Controller에서 데이터 조회 및 뷰 연결 (0) | 2025.07.02 |
Spring Boot 8강 - JPA 리포지토리와 메서드 쿼리로 데이터 조회하기 (0) | 2025.07.02 |
Spring Boot 6강 - JPA & H2 데이터베이스 연동을 위한 dependencies 추가와 application.properties 설정 (0) | 2025.06.30 |
Spring Boot 5강 - 컨트롤러에서 HTML 코드 직접 반환하기 (0) | 2025.06.30 |
Spring Boot 4강 - @RequiredArgsConstructor로 생성자 자동 생성하기 (1) | 2025.06.30 |