Wanna be Brilliant Full-Stack Developer

SpringBoot blog 만들기 Board 테이블 생성 본문

Back-End/블로그 만들기 With SpringBoot

SpringBoot blog 만들기 Board 테이블 생성

Flashpacker 2023. 2. 15. 19:27


id도 인트로 만들어서 primarykey니 id 어노테이션을 붙여주고! 

@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment 으로 넘버링 전략을 정해준다.

 

내용같은 경우는 엄청나게 길 수 있기 떄문에 툴을 쓸것인데 섬머노트라는 라이브러리를 사용할것이다.

우리가 전에 일반적인 글이 디자인이 들어가는데 그 디자인이 될때 <html>태그가 섞여서 디자인이 된다.

그러면 글자의 용량이 굉장히 커진다. 

@Lob는 대용량 데이터일때 사용한다.

 

조회수를 할떄도 디폴트 값을 줘야하는데 username할떄는 ' 따옴표가 있었는데
데이터베이스에서 애를 바처럼 쓸거기 떄문에 문자열로?

count는 int로 쓸거기 떄문에 number값이 되기떄문에 ' 따옴표 필요 없이 0으로 적는다.

 

@CreationTimestamp
private Timestamp createDate;

이렇게 해놓으면 데이터가 인써트 될때 자동으로 현재 시간이 들어간다.

 

마지막으로 가장 어려운? 이 보드를 누가 적는지 알아야한다.

private int userId; 이렇게 적으면 우리가 이 userid 값을 통해서 다시 user을 셀렉트 하든지

userid값을 통해서 Board와 user을 조인을 해서 데이터를 가져올 수 있는데

이 방식은 ORM에서는 사용하지 않고

key값으로 포린키로 찾지않고 바로 User오브젝트를 바로 넣으면 된다.

DB는 오브젝트를 저장할 수 없다. FK를 사용하지만 자바는 오브젝트를 저장할 수 있다.

FK를 사용하지 않고 자바랑 데이터베이스가 충돌이 일어나는데

자바는 오브젝트를 저장할 수 있지만 데이터베이스는 오브젝트를 저장할 수 없기 떄문에

자바 프로그램에서 데이터베이스에 자료형에 맞춰서 테이블을 만들게 된다.

무슨말인가? 

ORM을 사용하면 오브젝트를 그대로 저장할 수 있다.

이렇게 만들면 테이블이 어떻게 인식을 하는가? 

@JoinColumn(name="userId")
private User user;

이렇게 하면 userId라는 필드값이 들어간다.

userId라고만 들어가면 연관관계가 없다.

 

@ManyToOne
@JoinColumn(name="userId")
private User user; 

여기서 보면 Board가 Many이고 one user라는 것이다. 

 Many = Board , User = One 이게 무슨말인가? 한명의 유저는 여러개의 게시글을 쓸 수 있다는것이다.

여러개의 게시글은 한명의 유저에 의 해 쓰일 수 있다는것이다 그래서 ManyToOne이 된다는것이다.

 

만약에 OneToOne이라고 하면   One = Board , User = One 한명의 유저는 하나의 게시글밖에 쓸 수 없다는 것이다.

 

이게 만약에 OneToMany면 무엇일까? One = Board , User = Many 면?

하나의 게시글은  여러명의 유저가 쓸 수 있다는 것인데 말이 안된다?

 

ManyToOne이라고 우리는 정한다.

그러면 어떻게 되는가? 필드 값은 userId라고 만들어지고 연간관계는 ManyToOne이라고 user객체와 만들어진다.

이 User객체니까 user.java를 참조하여 자동으로 포린키가 만들어진다.

이대로 실행해보자 

create table Board (
       id integer not null auto_increment,
        content tinytext,
        count integer default 0 not null,
        createDate datetime(6),
        title varchar(100) not null,
        userId integer,
        primary key (id)
    ) engine=InnoDB

을 보면 userId가 integer로 되어있는데 

private User user; 처럼 오브젝트로 적어놨는데도 여기서는 알아서 FK로 만들어줬다,

왜냐하면 데이터베이스는 오브젝트를 저장할 수 없기 떄문에!

 

package com.cos.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;

@Entity
public class Board {

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