스프링부트 강좌 20강(블로그 프로젝트) - Board테이블 생성
이 보드를 누가 적었는지 알아야 한다. 그럼 유저의 아이디 값을 통해서 다시 유저를 셀렉트 하던지, 아니면 유저의 아이디 값으로 보더 유저를 조인해서 데이터를 가져올 수 있다. 하지만 orm 에서는 이 방식을 사용하지 않느나. Foreign Key로 찾는 게 아니라 그냥 User object를 바로 넣으면 된다. 데이터베이스는 오브젝트를 저장할 수 없다. 하지만 자바 프로그램, 객체지향프로그램에서는 오브젝트를 저장할 수 있다. 그럼 FK를 사용하지 않아도 된다.
여기서 충돌이 난다. 자바는 오브젝트를 저장할 수 있지만 데이터베이스는 오브젝트를 저장할 수 없다. 그렇기 때문에 자바가 어쩔 수 없이 데이터베이스에 맞춰서 오브젝트로 저장하는 게 아니라 키값을 저장하게 된다. 원래는.. 하지만 JPA 를 사용하게 되면, orm 을 사용하면 오브젝트를 그대로 저장할 수 있다. 이렇게 만들면 테이블이 어떻게 인식하게 될까?
package com.yuri.blog.model;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //빌더 패턴
@Entity //orm, 데이터베이스에 맵핑을 시켜주는 클래스이다라고 명시해주는 어노테이션을 가까이 명시하는 게 좋음
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") //int 값이니까 ' ' 없이 사용
private int count; // 조회수
@ManyToOne //Many = Board, User = One
@JoinColumn(name="userId") //실제로 db에 만들어질 때는 userId라는 이름으로 만들어 질 것이다.
private User user;
@CreationTimestamp
private Timestamp createDate;
}
@ManyToOne
@JoinColumn(name="userId") //실제로 db에 만들어질 때는 userId라는 이름으로 만들어 질 것이다.
private User user;
이게 실제로 FK가 되는데..useid라고 그냥 들어가기만 하면 연관관계가 없기 때문에 맺어줘야 한다.
그럼 필드값은 userid로 만들어지고, 연관관계는 manytoone으로 만들어진다.
private User user;
User 객체는 User.java를 참조한다. 자동으로 FK거 만둘어진다.
스프링부트 강좌 21강(블로그 프로젝트) - Reply 테이블 생성
mysqlworkbench 에서 보면 자동으로 FK가 생성된 것을 확인할 수 있다. 그 이유는.. 우리가 board table 을 만들 때 manytoone으로 설정하였기 때문이다. 그래서 userId라는 컬럼이 만들어지고, 자바에서는 obejct이지만 데이터베이스에서 만들어질때는 int값으로 만들어져야 한다. id를 참조하는 FK이기 때문에..!! 그래서 데이터베이스에 만들어질 때는 FK로 만들어진다.
답변 테이블 !!
package com.yuri.blog.model;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.CreationTimestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Reply {
@Id //Primary key
@GeneratedValue(strategy=GenerationType.IDENTITY) //프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
//oracle : sequence, mysql : auto_increment 로 간다는 뜻~
private int id; // 시퀀스, auto_increment
@Column(nullable = false, length = 200)
private String content;
@ManyToOne
@JoinColumn(name="boardId")
private Board board;
@ManyToOne
@JoinColumn(name="userId")
private User user;
@CreationTimestamp
private Timestamp createDate;
}
누가 어느 테이블에 있는 .. 연관관계가 필요하다. 이 답변은 어느 게시글에 있는지...!!여러개의 답변은 하나의 게시글에 존재할 수 있다.
답변을 누가 적었는지도 알아야 한다. 하나의 답변을 여러명이서 작성할 수는 없다. 이것도 ManyToOne! !!
여러개의 답변을 하나의 유저가 적을 수 있다.
boardId와 userId를 보면 int 값으로 만들어졌다. 왜?..User table의 id를 참조하고, Board table의 id를 참조하기 때문이다.
FK도 2개가 만들어졌다.
-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-