springboot - blog project (20,21)

Yuri Lee·2020년 8월 24일
0

springboot - blog project

목록 보기
11/49

스프링부트 강좌 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라고 그냥 들어가기만 하면 연관관계가 없기 때문에 맺어줘야 한다.

  • ManyToOne : Many 가 board 이고, one 이 user이다. 한명의 유저는 여러개의 게시글을 쓸 수 있다는 것이다. = 여러개의 게시글은 한명의 유저에 의해 쓰여질 수 있다.
  • OneToOne : 한명의 유저는 하나의 게시글 밖에 쓸 수 없다.
  • OneToMany : 하나의 게시글은 여러개의 유저가 사용할 수 있다. 말이 XXXXXX

그럼 필드값은 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 : 하나의 게시글에는 여러개의 답변이 있을 수 있다 (0)
  • OneToOne : 하나의 게시글에는 하나의 답변밖에..
  • OneToMany : 여러개의 게시글에는 하나의 답변만 올 수 있다(?) 말이 안된다.

답변을 누가 적었는지도 알아야 한다. 하나의 답변을 여러명이서 작성할 수는 없다. 이것도 ManyToOne! !!
여러개의 답변을 하나의 유저가 적을 수 있다.

boardId와 userId를 보면 int 값으로 만들어졌다. 왜?..User table의 id를 참조하고, Board table의 id를 참조하기 때문이다.

FK도 2개가 만들어졌다.

  • reply 테이블의 boardId는 board table의 id를 참조하고 있다.
  • reply 테이블의 userID user table의 id를 참조하고 있다.

-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-

profile
Step by step goes a long way ✨

0개의 댓글