Wanna be Brilliant Full-Stack Developer

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

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

SpringBoot blog 만들기 User 테이블 생성

Flashpacker 2023. 2. 15. 18:56


블로그에서는 대댓글은 없고 댓글까지만 되도록 구현을 할것이다.

그리하여 Blog 테이블 만들기를 할것인데!? 

테이블을 생성하기위한 모델들이 이곳에 만들어질것이다.

첫번쨰로 만들것은 USER 클래스이다. 

일단 모든 테이블에는 primary키가 있어야한다

private int id; // 오라클(시퀀스), 

Mysql(auto_increment) 넘버링하는 전략을 가져갈것이다.

package com.cos.blog.model;

import java.sql.Timestamp;

public class User {

	private int id; // 오라클(시퀀스), Mysql(auto_increment)
	
	private String username; // 아이디
	
	private String password;
	
	private String email;
	
	private Timestamp createDate;
}

회원정보를 수정하는 업데이트Date도 필요하긴한데 우리는 createDate만 사용하겠다.

이렇게 만들고 이 클래스를 테이블화 시키기 위해서는 @Entity라는 어노테이션을 붙여야한다. 

이걸 붙이게되면 User클래스가 우리 JPA 스프링부트 프로젝트가 시작될떄 user클래스를 통해서

밑에 아이들을 찍어서 자동으로 MySql에 테이블이 생성이 된다. 

 

Id는 애가 시퀀스(primarykey)라는걸 알리기 위해서는 Id라는 어노테이션을 추가한다.

두번쨰로는 넘버링 전략인데 넘버링 전략이 무엇인가?

 

우리가 해당 프로젝트에서 연결된 데이터베이스에 연결된 DB의 넘버링 전략을 따라간다는것이다.

무엇을 따라간다는건가? 내가 만약에 오라클을 연결했으면 Sequence를 사용한다는것이고

Mysql을 사용한다고 하면 Auto_increment를 사용한다는 것이다. 

 

그리고 이건 무엇이랑 연결이 되는가하면

yml에 보면 use-new-id-generator-mappings 이 부분을 보면 

mysql을 보면 auto_increment를 사용할떄 어떤 방식을 사용할지 결정하는것인데

false라고 하면 JPA가 기본 넘버링 전략을 따라가지 않는다는것이다.

true라고 하면 JPA가 사용하는 기본넘버링 전략을 사용한다는 것인데

우리는 false라고 해서 JPA가 사용하는 기본넘버링 전략을 따라가지 않을것이다.

 

username은 회원가입할때 Null값이 되면 안된다.

@Column(nullable = false, length = 30) 이렇게 하면 null값이 못나오고 길이가 총 30글자까지만 된다.

패스워드도 똑같이! 패스워드를 왜 100이나 주는가 물어보면? 

이 패스워드가 123456이면 이 6자밖에 안되는데? 왜 길게 하는가 하면 나중에 줄여지면 되니까

넉넉하게 주는것이다. 우
리가 넣는 패스워드를 나중에 해쉬로 변경을 해서 비밀번호를 암호화 할것이다.

이메일도 똑같지만

 

시간은 이 회원이 가입한 시간을 이야기하는것인데? 

회원이 가입했을떄 그 시간! 시간은 mysql로 이야기하면 NOW(현재시간)라고 넣어주는 쿼리를 넣을수도 있지만

우리는 여기서 어노테이션을 해보려고 한다. 

@CreationTimestamp 을 하면 시간이 자동입력이 된다.

회원가입할떄 이 값들이

private int id; // 오라클(시퀀스), Mysql(auto_increment)

@Column(nullable = false, length = 30)
private String username; // 아이디

@Column(nullable = false, length = 100) // 123456 => 해쉬(비밀번호 암호화) 
private String password;

@Column(nullable = false, length = 50)
private String email;

insert할것이다.  이 부분을 비워놀것이다. 아이디 부분을 비워놔도 자동으로 들어갈것이다.
그건 auto_increment 이기 떄문에 그리고 시간도 비워놔도 괜찮다
자동으로 creationTimeStamp 어노테이션을 했기 떄문이다.

 

그리고 하나만 더추가하자 

 

private String role; // Enum을 쓰는게 좋다. 

 

Enum을 쓰면 어떤 데이터에 도메인을 만들어줄  수 있다. 그게 무슨말인가?

우리가 role이라는것은 어떤 회원이 회원가입을 했을떄 이사람이 Role은 admin이다. 일반 user이다. manager이다.

어드민은 모든글을 삭제하고 유저는 자기 글만 삭제 할 수 있도록,

매니저는 관리자 페이지를 들어가서 관리할 수 있는

권한을 주는것인데 이 세개의 권한을 주는 role은 타입이 String이기 떄문에 실수로 말도 안되는 role을 넣을 수 있다.

Manager인데 mangerrrrr 과 같은 오타를 해서 데이터베이스에 넣을 수 있기 떄문에

 

우리가 만약에 enum이라는 전략을 쓰면 이 값을 String이 아니라 이 세개중 하나만 들어가도록 도메인 설정을 할 수 있다.

이 도메인이 라는건? 어떤 범위를 말한다. 도메인이 정해졌다는것은 어떤 범위가 정해졌다는 것이다.

만약에 성별이라는게 있다면 도메인은 남과 여 이고 

학년이라는게 있다면 초등학생이라면 1학년부터 6학년이다. 

고등학생이면 1~3 과 같은 도메인 설정을 Enum이라는걸 통해 할 수 있지만 

우리는 String으로 정의를 할것이다.

 

일단 회원가입 할때 디폴트 값을 줄것이다.

@ColumnDefault 컬럼에 디폴트 값을 @ColumnDefault("user") 라고 줄수가 없다.

요 안에다가  양옆으로 '을 넣어야한다. 이게 문자라는걸 알려주는것이기 떄문이다.

 

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;

@Entity // User클래스가 MySQL에 테이블이 생성이 된다.
public class User {

	@Id //Primary key
	@GeneratedValue(strategy = GenerationType.IDENTITY ) //
	private int id; // 오라클(시퀀스), Mysql(auto_increment)
	
	@Column(nullable = false, length = 30)
	private String username; // 아이디
	
	@Column(nullable = false, length = 100) // 123456 => 해쉬(비밀번호 암호화) 
	private String password;
	
	@Column(nullable = false, length = 50)
	private String email;
	
	@ColumnDefault("'user'")
	private String role; // Enum을 쓰는게 좋다.
	
	@CreationTimestamp // 시간이 자동으로 입력
	private Timestamp createDate;
}

만들어졌는지 확인하기위해서는 yml에 

ddl-auto가 create가 되어있는지 확인을 해야한다.

create가 되어있는지 왜 확인 해야하는가?

이거를 update라고 할 수도 있고 none이라고도 할 수 있다.

그리고 crate라고 하면 테이블을 새로 만들겠다는 것이다.

내가 만약에 user라는 기존 테이블에 있다고 하더라도 실행할때마다 다시 만들겠다는것이다. 

프로젝트를 한번 만들어서 테이블이 한번 생성되어있고 그 안에 데이터를 넣어놨는데

create가 되어있으면 

그리고 그다음에 프로젝트를 실행할때마다 테이블이 새로 만들어지고 그 안에 있는 데이터가 다날라간다.

최초에는 create라고만하고 나중에는 update라고 해야한다. update라고 해야 테이블을 새로 만들지 않고

기존에 있는 데이터에 추가해서 데이터가 DB에 들어간다.

MYSQL이 실행중이여야한다.

 

Hibernate: 
    
    drop table if exists User
Hibernate: 
    
    create table User (
       id integer not null auto_increment,
        createDate datetime(6),
        email varchar(50) not null,
        password varchar(100) not null,
        role varchar(255) default 'user',
        username varchar(30) not null,
        primary key (id)
    ) engine=InnoDB

기존에 있던 테이블을 삭제하고 새로 만들었다. 이렇게 테이블이 만들어졌다는것을 보여준다.

이게 튀어나올수 있는 이유는

show-sql에 true라고 했기 떄문이다. 

false라고 했으면 콘솔창에 보이지 않을것이다. 원래는 한줄로 보여서 엄청 지저분한데

  properties:
      hibernate.format_sql: true

라고 해놓으면 이렇게 정렬이 되어서 정리해서 나온다. 

 

use-new-id-generator-mappings: false 이거는 JPA의 기본 넘버링 전략을 따라가지 않겠다는 것이다.

 

physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
이거는 무엇인가?

엔티티를 만들떄? 테이블을 만들때? 변수명 그대로 데이터베이스에 필드를 넣어준다는것이다.

무슨말인가? 변수명이 username, password와 같은 변수명을
그대로 테이블에 있는 필드를 만들어준다는것이다.

 

만약에 우리가 이 전략을 쓰지 않고 다른 전략인 SpringPhysicalNamingStrategy전략을 쓰게 되면

우리가 만약에 커멜 표기법 myEmail이라고 정의를 했으면?
기본전략인 PhysicalNamingStrategyStandardImpl 이걸했으면

필드 만들어질때 myEmail이라고 만들어지는데?

 

만약에 SpringPhysicalNamingStrategy 이 전략을 쓰게 되면 

커멜 표기법을 언더스코어로 바꿔서 소문자로 바꿔 버린다. my_email로 바꾼다.

근데 우리는 언더바 전략을 쓰지 않고 저 그대로 테이블을 만들것이기 떄문에

테이블에 있는 필드명을 그대로 쓸것이기 때문에 PhysicalNamingStrategyStandardImpl 이걸 그대로 사용할것이다.

 

실제로 테이블이 만들어졌는지 확인해보자!

다른 필드의 이름으로 바꾸고 싶으면 수정을 하고 저장을 하면 

이렇게 바로 저장이 된다. JPA가 아주 좋다.

 

JPA는 ORM이다. 

ORM이라는건 자바에 있는 모든 언어들에 있는 OBJECT를 테이블로 매핑해주는 기술이다.

OBJECT를 만들면 JPA가 테이블로 만들어준다.