이번 포스트에서는 엔티티를 만들고 JPA 를 통해 데이터베이스에 테이블을 생성해보겠습니다.
시작
먼저 다음과 같이 model 패키지를 만들어줍니다.
앞으로 model 패키지 안에 데이터베이스의 테이블과 연결이 되는 엔티티들이 작성될것입니다.
엔티티 구성
질문 엔티티
- id : 번호 (기본키)
- subject : 제목
- content : 내용
- create_date : 작성일시
답변 엔티티
- id : 번호 (기본키)
- question : 어떤 질문인지 확인하는 속성
- content : 내용
- create_date : 작성일시
질문 엔티티
위에서 만든 model 패키지 안에 Question.java 를 다음과 같이 생성합니다.
package com.crud.model;
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 lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
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;
}
Question 클래스를 엔티티로 만들기 위해서는 @Entity 애너테이션을 추가해줍니다.
또한, @Id 애너테이션은 기본키로 지정해주며,
@GeneratedValue 를 통해 해당 속성에 값을 저장하지 않아도 1씩 자동으로 증가시켜줍니다.
답변 엔티티
Question 과 동일하게 Answer 클래스를 다음과 같이 작성합니다.
package com.crud.model;
import java.time.LocalDateTime;
import org.springframework.data.annotation.CreatedDate;
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;
@Entity
@Getter
@Setter
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime createDate;
@ManyToOne
private Question question;
}
여기서 @ManyToOne 이라는 애너테이션이 사용되었는데 이것은 엔티티 간의 관계를 나타냅니다.
하나의 질문에 답변이 여러개 달릴 수 있기 때문에 답변과 질문의 관계는 N:1 입니다.
이는 Many (Answer) To One (Question) 으로 연결할 수 있습니다.
질문 엔티티 추가
반대로 질문 엔티티에서도 답변 엔티티를 참조해서 사용할 수 있기 때문에 둘의 관계를 추가해줍니다.
package com.crud.model;
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;
@Entity
@Getter
@Setter
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;
}
@OneToMany 의 mappedBy 속성은 엔티티 사이의 관계에서 양방향 관계일때 주인을 표시하는 애너테이션입니다.
또한, cascade 는 데이터베이스의 CASCADE 와 동일한 옵션으로 참조하는 엔티티(Question) 이 삭제되면
같이 삭제되는 속성입니다.
다음으로 application.properties 파일에 내용을 추가해야합니다.
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
위와 같이 spring.jpa.hibernate.ddl-auto 를 create 로 설정하면
스프링부트가 실행될때마다 JPA 가 model 에 작성한 Entity 를 확인하고 테이블을 생성합니다.
여기까지 작성했으면 스프링부트를 실행하고 데이터베이스를 확인해봅니다.
MariaDB [(none)]> use springboot_crud;
Database changed
MariaDB [springboot_crud]> show tables;
+---------------------------+
| Tables_in_springboot_crud |
+---------------------------+
| answer |
| question |
+---------------------------+
2 rows in set (0.003 sec)
데이터베이스를 보면 answer 과 question 테이블이 생성된 것을 확인할 수 있습니다.
MariaDB [springboot_crud]> desc answer;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| content | text | YES | | NULL | |
| create_date | datetime | YES | | NULL | |
| question_id | int(11) | YES | MUL | NULL | |
+-------------+----------+------+-----+---------+----------------+
4 rows in set (0.011 sec)
MariaDB [springboot_crud]> desc question;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| content | text | YES | | NULL | |
| create_date | datetime | YES | | NULL | |
| subject | varchar(200) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.009 sec)
'Spring > Springboot 실습' 카테고리의 다른 글
게시판 만들기 - 질문 상세페이지 작성 (0) | 2023.01.08 |
---|---|
게시판 만들기 - service 작성 (0) | 2023.01.08 |
게시판 만들기 - 브라우저를 통한 데이터 출력 (0) | 2023.01.08 |
게시판 만들기 - Repository 작성 (0) | 2023.01.06 |
게시판 만들기 - 시작 및 환경설정 (0) | 2023.01.04 |