스프링부트 with JPA - DB 테이블 생성

최준호·2024년 2월 5일

Blog 테이블 생성하기 (User, Board ,Reply)
User 테이블 생성

  • model 패키지를 생성!

  • User 테이블을 만들기 위해선 클래스 전체를 @Entity 어노테이션을 추가해줘야한다.
  • @Id : 프라이머리 키
  • @GeneratedValue : DB의 넘버링 전략을 따른다
  • @Column : 컬럼에 해당하는 변수를 표시
  • @ColumnDefault : 컬럼에 해당하는 변수 표시와 기본값을 설정 (" '따음표중요' ")
  • @CreationTimestamp : DB에 데이터 입력을 할 때마다 시간을 입력해준다.

  • 실행된 sql문
package com.junho.blog.model;




import java.sql.Timestamp;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
// ORM -> java(다른 언어) -> 언어로 만든 변수들을 테이블로 매핑시켜주는것.
@Entity // User 클래스가 MySQL에 테이블이 생성이 된다.
public class User {
	
		@Id // Primary Key
		@GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
		private int id; // 시퀀스, auto_increment
		
		@Column(nullable=false, length = 30)
		private String username; // 아이디
		
		@Column(nullable=false, length = 30)
		private String password;
		
		@Column(nullable=false, length = 30)
		private String email;
		
		@ColumnDefault("'user'")
		private String role; // Enum을 쓰는게 좋다. // admin, user, manager
		
		@CreationTimestamp // 시간 자동 입력
		private Timestamp createData;
		
}

확인 해보면 테이블이 생성된 걸 알 수 있습니다!

ORM은 다른 프로그래밍 언어들을 (JAVA) 활용하여 변수들을 설정하고 테이블로 매핑시켜주는 것 말합니다


Board 테이블 생성

@Lob : 대용량 데이터를 저장할 수 있는 컬럼을 생성
@ManyToOne : 한명의 유저는 여러개의 게시글을 사용할 수 있다는 의미입니다.
@JoinColumn(name="userId") : FK로 다른 테이블과 조인을 해야하는데, 그걸 설정해준느 어노테이션
테이블이 생성될 때는 name의 값으로 컬럼명이 지어진다

  • 실행된 sql문

잠시 살펴보니 @lob으로 설정한 컬럼이 tinytext로 설정이 되었네요
@lob의 디폴트가 이젠 tinytext로 변경이 된거같네요.
따라서 이걸 해결하기 위해

	@Column(columnDefinition = "longtext") // 대용량 데이터
	private String  content;

로 다시 정의하겠습니다.

package com.junho.blog.model;

import java.sql.Timestamp;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.Lob;
import jakarta.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Board {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY) // auot_increment
	private int id; // 키값
	
	@Column(nullable=false,length=100)
	private String  title; // 제목
	
	@Column(columnDefinition = "longtext") // 대용량 데이터
	private String  content; //섬머노트 라이브러리 <html>태그가 섞여서 디자인이 됨.
	
	@ColumnDefault("0")
	private int count; // 조회수
	
	@ManyToOne // Many = board, User = One
	@JoinColumn(name="userId")
	private User user; //DB는 오브젝트를 저장할 수 없다. // 자바는 오브젝트를 저장할 수 있다. // FK
	
    @CreationTimestamp
	private Timestamp createDate; // 생성일
}

  • 실행된 sql문

Reply 테이블 생성

package com.junho.blog.model;

import java.sql.Timestamp;

import org.hibernate.annotations.CreationTimestamp;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Reply {
	
	@Id // Primary Key
	@GeneratedValue(strategy = GenerationType.IDENTITY) // auot_increment
	private int id;
	
	@Column(nullable=false, length = 200)
	private String content;
	
	@ManyToOne // Many = Reply, User = One
	@JoinColumn(name="boardId")
	private Board board;
	
	@ManyToOne // Many = Reply, User = One
	@JoinColumn(name="userId")
	private User user;
	
	@CreationTimestamp // 시간 자동 입력
	private Timestamp createDate;
	
	
	

}

Board 테이블 수정

추가사항

@OneToMany(mappedBy="board",fetch = FetchType.LAZY) // mappedBy 연과관계의 주인이 아니다 (난 FK가 아니예요) DB에 칼럼을 만들지 마세요
	private List<Reply> reply;

Board 테이블을 사용할 시 댓글도 같이 보일 수도 있고 안보일 수게 처리를 할려고 합니다.

  • @OneToMany(mappedBy="board",fetch = FetchType.LAZY) : 하나에 게시글에 여러 댓글이 들어갑니다. 따라서 OneToMany 처리를 하고 리스트로 불러옵니다. fetch= FetchType.LAZY를 적용하여 필요할 시에만 데이터를 넣는다는 의미로 넣어뒀습니다. 이 어노테이션의 fetch의 기본값은 FetchType.EAGER 인데 이건 무조건 값을 불러온다는 의미입니다.

Reply 모델의 설정한 변수명을 맵핑네임에 넣는 것입니다.

profile
변화를 두려워하는 사람이 가장 불행한 사람이다.

0개의 댓글