Wanna be Brilliant Full-Stack Developer
SpringBoot blog 만들기 Board 테이블 생성 본문
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;
}
'Back-End > 블로그 만들기 With SpringBoot' 카테고리의 다른 글
SpringBoot Blog 만들기 연관관계의 주인 (0) | 2023.02.15 |
---|---|
SpringBoot Blog 만들기 Reply 테이블 생성 (0) | 2023.02.15 |
SpringBoot blog 만들기 User 테이블 생성 (0) | 2023.02.15 |
SpringBoot Blog 만들기 Lombok 세팅하기 과 YML 설정하기 (0) | 2023.02.15 |
SpringBoot Blog 만들기 Maven이란? (0) | 2023.02.13 |