JavaProject/Spring Boot

Spring Boot(User Table 생성, MySQL)

devel0per 2022. 9. 5. 23:46

Boot를 공부하니 Database와 연결하는 것이 Spring Lagacy Project 할 때보다, 훨씬 수월했다.

src/main/resources 내부에 있는 properties 파일을 yml 파일로 변경 후 yml의 설정에 맞게

 

Spring:

  datasource:

    driver-class-name:  com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul

    username : root

    password : 1234

 

이렇게 설정해주면 MySQL과 연결은 끝 !

 

이제 Boot 내에서 일정한 형식을 통해 MySQL문에 쿼리문 데이터를 보내 테이블을 생성할 수 있는데, 그것을 해보려고 한다!

 

일단 테이블을 만들기 위해 yml 파일을 일부 추가해야 한다.

 

 

1번은 위에서 설명한 MySQL과의 접점을 만들어주는 코드이고

2번은 ddl-auto

  • create - 서버 시작시마다 DB초기화
  • update - 수정사항만 DB에 반영
  • none - DB에 아무런 반영을 하지 않음.

현재는 처음 user 테이블을 만드는 거라 create로 설정을 해뒀지만, 계속해서 create로 설정해놓으면, 컬럼값이 완전히 초기화 되버리니 유념하는것이 좋다!

 

3번은 physical-strategy

그리고 마지막 설정은 use-new-id-generator-mappings: false

use-new-id-generator-mappings 는 mysql로 말하면 auto_increment 오라클로 말하면 시퀀스를 어떤식으로 사용할지 방식을 결정하는 것인데 false를 하면 jpa가 사용하는 기본 넘버링 전략을 따라가지 않는다는 뜻이고 true를 하면 기본 넘버링 전략을 따라간다는 뜻이다.

 

이렇게 간단하게 yml의 설정을 마치면 본격적으로 boot내에서 쿼리문을 작성해주면 된다.

src/main/java에 속해있는 패키지를 하나 생성하고 그 내부에 user.java 파일을 생성해준다.

 

내가 blog 스키마에 만들 user 테이블에는 id, username, password, email, role, createdTime 이렇게 6개의 컬럼을 생성할 예정이다. 이것을 쿼리문으로 작성하면(oracle database 형식)

CREATE TABLE USER(

id NUMBER(20) PRIMARY KEY,

username VARCHAR2(30) NOT NULL,

password VARCHAR2(100) NOT NULL,

email VARCHAR2(50) NOT NULL,

role VARCHAR2() DEFAULT 'user',

TIMESTAMP DEFAULT SYSDATE);

이런식으로 작성할 수 있을것이다 ~ ( 연결은 MySQL로 해놓고 Oracle로 쿼리문 작성해버리는 .. ㅋㅋㅋ 대충 예시로만 보세요!)

 

이것을 User.java에서는 어떻게 표현할까?

가장 먼저 @Entity라는 어노테이션을 생성한다. @Entity가 붙은 클래스는 JPA가 관리하는 것으로 DB 테이블에 대응하는 것으로 생각하면 된다!

@ID 어노테이션을 이용해 Primary key 제약 조건을 설정할 수도 있고

@GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 이용해 프로젝트에서 연결된 DB 즉 여기서는 MySQL이니 auto create 방식으로 따라갈 것이다.

@Column 어노테인션을 이용해서 NOT NULL 제약 조건을 걸어줄 수도 있고, 글자수의 제약도 걸어줄 수 있다.

@ColumnDefault 어노테이션을 이용하여 Default값을 정해줄 수 있고

@CreationTimestamp 어노테이션을 이용하여 sysdate(oracle), now(mysql)과 같이 시간을 자동으로 입력해줄 수도 있다.

 

간단한 어노테이션으로 쿼리문을 완성해보면

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;

// ORM -> JAVA(다른언어) Object --> 테이블로 매핑해주는 기술
@Entity
public class User {
	
	@Id //Primary key
	@GeneratedValue(strategy = GenerationType.IDENTITY)// 프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
	private int id; // 시퀀스, auto_increment
	
	@Column(nullable = false,length = 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 createdTime;
	
}

이렇게 완성되고 부트를 실행해서 실제로 테이블이 잘 만들어지는 확인을 해보면 

 

콘솔창에 이렇게 이쁘게 쿼리문이 정리되어 보여지고, MySQL Workbench에 들어가서 테이블을 확인해보면, 아주 이쁘게 잘 들어가 있는것을 확인할 수 있다!


요즘 Oracle Database 공부중이라 수 많은 쿼리문을 작성하고 연습하고 했는데, 쿼리문을 응용해서 Boot와 Mysql을 연결하는 작업, 쿼리 데이터를 전송해서 테이블을 만들어보는 작업을 진행하니 굉장히 반갑고 재밌었다 ~~ Spring 프레임워크만 만져본(?) 나지만, boot를 더 잘 만지는(?) 느낌은 기분탓이려나,, 뭐 다양한 프레임워크를 만져보는 것은 나에게는 무조건 득일테니~ 앞으로도 열심히 만져(?)보자~~