Spring/Spring 블로그만들기

[Springboot] 나만의 블로그 만들기 - 10. 테이블 생성(User, Board, Reply)

개발자하소서 2022. 3. 21. 12:46
728x90
반응형
SMALL

📌 테이블 설정하기

 

1. com.cos.blog.model 이라는 패키지를 만든다.

  여기서는 데이터베이스를 다룰 것이다

 

 

 

2. 패키지 안에 User, Reply, Board라는 클래스를 만든다.

 

 


 

📌 user 테이블 설정하기

 

package com.cos.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 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 // 이 어노테이션을 사용하면 
            // user클래스가 MySQL에 테이블이 자동으로 생성됨
public class User {

	@Id // primary key
	@GeneratedValue(strategy =GenerationType.IDENTITY)
	// 해당 프로젝트에서 연결된 db의 넘버링 전략을 따라간다.
	// 즉, 내가 오라클을 사용한다면 시퀀스를 사용한다는 것이고
	// mysql을 사용한다면 auto_increment를 사용한다는 뜻이다
	private int id;//시퀀스. auto_increment
	
	@Column(nullable = false, length = 30)// 아이디의 column의 값이 nul이 되면 안되기에   false로 설정하고 길이는 30으로 설정
	private String username; //아이디
	
	@Column(nullable = false, length = 100)// 비밀번호길이를 굳이 길게 설정하는 이유는 나중에 해쉬로 비밀번호를 암호화 할 것이기때문이다 
	private String password; //비밀번호
	
	@Column(nullable = false, length = 50)
	private String email; //이메일
	
	@ColumnDefault("'user'")
	private String role; // Enum을 쓰는 것이 좋다. // admin, user, manager 도메인(=범위) 설정할 수 있다
	
	@CreationTimestamp // 시간이 자동으로 입력된다.
	private Timestamp createDate; // 가입시간
}

 

실행시키면 다음과 같은 결과를 나타낸다.

 

 

**즉, yaml에서 작성했던 jpa 의 의미는**

 1. ddl-auto : create

   -> 원래 있던 user테이블을 삭제하고(drop table) 새로 생성하는 것

 2. show-sql: true

   ->  콘솔창에 위와 같이 테이블 작성한 sql문을 보여주는 것

 3. hibernate.format_sql : true

   -> true함으로써 위와같은 sql문을 한줄이 아니라 잘 정렬해서 콘솔창에 나타내게 해줌

 4. use-new-id-generator-mappings: false

    -> false 함으로써 기본적인 jpa전략을 따르지 않겠다는 의미
 5. physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    -> 테이블을 만들때 변수명 그대로 필드를 만든다는 의미

 

  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: create
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      use-new-id-generator-mappings: false
    show-sql: true
    properties:
      hibernate.format_sql: true

 

실행후 MySQL 워크벤치에 들어가보면 테이블이 생성되어 있는 것을 확인할 수 있다.

 

 

이처럼 JPA를 이용하면 간편하게 테이블을 생성할 수 있다. 

ORM -->  JAVA(다른언어포함) object -> 테이블로 매핑해주는 기술

 


📌 Board 테이블 생성 

package com.cos.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
public class Board {

	
	@Id // primary key
	@GeneratedValue(strategy =GenerationType.IDENTITY)
	// 해당 프로젝트에서 연결된 db의 넘버링 전략을 따라간다.
	private int id;
	
	
	@Column(nullable = false, length = 100)
	private String title; // 게시판 제목
	
	@Lob // 대용량 데이터 
	private String content; //게시판 내용 -> 엄청난 내용물이 필요함
	// 섬머노트 라이브러리 <html>태그가 섞여서 디자인 됨

	@ColumnDefault("0")
	private int  count;// 게시판 조회수

	@ManyToOne // board가 many 고, user가 one이라는 뜻
	// 한명의 user는 여러개의 게시글을 쓸 수있다.
	@JoinColumn(name="userId")
	private User user; // DB는 오브젝트를 저장할수없다.
							  //  FK, 자바는 오브젝트를 저장할수있다 	

	@CreationTimestamp // 시간이 자동으로 입력된다.
	private Timestamp createDate; // 데이터가 입력될때 현재시간 자동 입력
	
}

 


📌 Reply 테이블 생성 

 

 

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

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder //빌더패턴
@Entity
public class Reply {

	@Id // primary key
	@GeneratedValue(strategy =GenerationType.IDENTITY)
	// 해당 프로젝트에서 연결된 db의 넘버링 전략을 따라간다.
	private int id;
	
	@Column(nullable = false, length = 200)
	private String content; //답변 내용
	
	@ManyToOne // 연관관계 만들어주기 // 여러개의 댓글은 하나의 게시글에 작성 가능
		//many =댓글 // one=게시글
	@JoinColumn(name="boardId")
	private Board board;
	
	@ManyToOne // 연관관계만들어주기 // 하나의 유저는 여러개의 댓글을 달 수 있다.
	// many = 댓글 // one = 유저
	@JoinColumn(name="userId")
	private User user;
	
	@CreationTimestamp // 시간이 자동으로 입력된다.
	private Timestamp createDate; // 데이터가 입력될때 현재시간 자동 입력
	

}

 

테이블 3개가 모두 생성되었다.

 

 

728x90
반응형
LIST