환경
Framework : Spring Boot 3.1.5
Build : Gradle 8.4
JDK : JDK21
할것 요약
1. build.gradle에 JPA dependency 추가하기
2. application.yml에 JPA 설정 추가하기
3. JPA Entity 생성
4. JPA Repository 생성
5. JPA CRUD API 만들어보기
dependencies {
// JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
spring:
## JPA Setting Info
jpa:
hibernate:
ddl-auto: create # option type: create, create-drop, update, validate, none
properties:
hibernate:
diarect: org.hibernate.dialect.H2Dialect # 쿼리의 기준이 되는 데이터베이스 엔진을 설정합니다.
show_sql: true # sql 쿼리를 보여줍니다.
format_sql: true # sql query formatting
use_sql_comments: true # sql 쿼리의 추가정보를 보여줍니다.
logging:
level:
org:
hibernate:
type:
descriptor:
sql: trace # query의 ?에 어떤 값이 들어가는지 추적할 수 있는 설정입니다. TRACE Log에 값을 보여줍니다.
엔티티는 데이터베이스 테이블과 매핑되는 자바클래스를 말한다.
질문과 답변에 해당하는 엔티티가 있어야함.
package com.ll.sbmission20231121;
import jakarta.persistence.*;
import lombok.Generated;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Entity
//JPA 가 엔티티로 인식한다.
public class Question {
@Id
//데이터 구분을 위함.
// JPA 에서 엔티티의 기본 키 값을 자동생성하는 방법을 지정하는 어노테이션.
// 엔터티를 데베에 저장시에 해당 엔터티의 기본 키 값을 자동 생성후 이를 데베의 identity 컬럼에 의존해 할당
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//질문의 고유번호
@Column(length = 200)
//컬럼의 길이
private String subject;
//질문의 제목
@Column(columnDefinition = "TEXT")
//테이블의 열과 매핑 시 정의를 지정하는 어노테이션 . 열의 정의를 "text"로 지정
// 글자수 제한 두지 않음 .
private String content;
//질문의 내용
private LockModeType createDate;
//질문을 작성한 일시
@OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
private List<Answer> answerList;
}
package com.ll.sbmission20231121;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
import java.time.LocalDateTime;
@Getter
@Setter
@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;
//어떤 질문에 대한 답변 인지 알기 위한 질문 속성
}
//sql 대신에 create 테이블 을 만듦
//insert in (1, "제목")
//insert in (2, "제목")
//insert in (3, "제목")
@Id
//ID 컬럼은 primary key
@GeneratedValue(strategy = GenerationType.IDENTITY)
//자동으로 인덱스 값증가해서 붙여주기 위해서 IDENTITY 컬럼 사용.
private Integer id;