하나씩 차근차근
article thumbnail

이번 포스트에서는 엔티티를 만들고 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)

 

profile

하나씩 차근차근

@jeehwan_lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!