간단한 게시판 만들기 - Datasource

Martin the dog·2024년 1월 3일

프로젝트

목록 보기
2/3

데이터 구조도

테이블의 id는 어떻게 할 것인가?

1. AUTO INCREMENT

장점: 가장 단순하며 Primary key에 자동으로 index가 걸리는 MySQL 설정상 삽입, 삭제, 정렬시 UUID보다 빠르다(UUID는 AUTO INCREMENT와 비교시 크기가 크기 때문), 유저&개발자 입장에서 봤을 때 이해하기 쉽다(몇번째 게시물인지 바로 확인할 수 있기 때문).
단점: 분산되어 저장될시 각 서버별로 ID가 AUTO INCREMENT로 생성되기 때문에 다른 글이어도 같은 아이디를 가질 수 있다. 분산된 데이터를 병합시 시간이 오래걸릴 수도 있다, id가 단순히 증가하는 숫자이기 Primary key를 예측하기 쉬워 보안상 문제가 있을 수도 있다, 외부 노출시 규모 추정이 쉬워진다.

2. UUID

장점: UUID는 언제나 다른 값을 지니기 때문에 분산 저장후 데이터를 병합시 문제가 전혀 없다, 완전히 랜덤한 값이 생성되는 것이기 때문에 규모 추정이 어렵고 Primary key를 예측하기 어려워 보안에 이점이 있다.

단점: Primary key에 자동으로 index가 걸리는 MySQL 크기가 큰 UUID는 삽입,삭제, 정렬시 많은 오버헤드가 있을 수 있다, 유저&개발자 입장에서 봤을 때 이해하기 어렵다, 크기가 크다

결론

현재 기획중인 게시판의 경우에는 분산저장되는 경우가 없기 때문에 AUTO INCREMENT 를 적용하는게 적합할 것 같다. PK가 외부에 노출될 시 규모추정을 막고 보안을 높이고자 pk를 암호화/복호화 하여 원본 PK의 노출을 막고자 할 것이다.

MySQL 쿼리문

  CREATE DATABASE dash_board; // DB생성
  
  CREATE TABLE `DASH_BOARD`.`ARTICLE` //article 테이블 생성 쿼리
(
	`ID` INT NOT NULL auto_increment,//자동으로 증가하게 하였다.
    `TITLE` VARCHAR(255) NOT NULL,
    `CONTENT` TEXT NOT NULL,
    `USERNAME` VARCHAR(100) NOT NULL,
    `CREATEDDATE` TIME NOT NULL,
    `CHANGEDATE` TIME NOT NULL,
    PRIMARY KEY(`ID`) //기본키 설정
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 collate=utf8mb4_0900_ai_ci;
//테이블을 어떻게 관리할지 설정해주는 내용으로 엔진은 INNODB를 이용하며 글은 utf8을 통해 렌더링해주며 정렬 기준은 utf8mb4_0900_ai_ci 임을 의미한다.
CREATE TABLE `DASH_BOARD`.`ARTICLEFILE` 
(
	`ID` INT NOT NULL auto_increment,
    `ARTICLEID` INT NOT NULL,
    `UPLOADDATE` TIME NOT NULL,
    `FILENAME` TEXT NOT NULL,
    `FILE` BLOB NOT NULL,
    PRIMARY KEY(`ID`),
    FOREIGN KEY (`ARTICLEID`) REFERENCES `ARTICLE` (`ID`) ON DELETE CASCADE 
    //외래키 설정 ARTICLE의 ID와 ARTICLEFILE의 ARTICLEID를 맺어주었다.
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 collate=utf8mb4_0900_ai_ci;

CREATE TABLE `DASH_BOARD`.`REPLY` 
(
	`ID` INT NOT NULL auto_increment,
    `ARTICLEID` INT NOT NULL,
    `CONTENT` VARCHAR(255) NOT NULL,
    `CREATEDDATE` TIME NOT NULL,
    PRIMARY KEY(`ID`),
    FOREIGN KEY (`ARTICLEID`) REFERENCES `ARTICLE` (`ID`) ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 collate=utf8mb4_0900_ai_ci;

생성 결과

Spring boot에 mysql 설정

# application.properties
# MYSQL 설정
spring.datasource.url=jdbc:mysql://localhost:3306/dash_board?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password= ~
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# SQL 출력여부
spring.jpa.show-sql=false
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

# hibernate 설정
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=false
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

# dev실행
spring.profiles.active=dev # dev property의 설정을 사용하게 한다.


///////////////////////////////////////////////////////////

# application-dev.properties
spring.jpa.sho-sql = true # 기존에 설정된 값은 false 였지만 dev의 내용이 덮어써진다.

DB Connect 확인

//test Post Controller
package com.board.board.Component;

import java.sql.Connection;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
![](https://velog.velcdn.com/images/martindog/post/0f5e30c4-2202-4ea2-b5e4-840bfaec8ee5/image.png)

@RestController
@RequestMapping("/test")
public class checkDBCon {
    @Autowired
    DataSource dataSource;
    @GetMapping("/db")
    public String getMethodName() throws Exception{
        Connection con = dataSource.getConnection();

        return con.getMetaData().getURL();
    }
}

결과

잘 연결 되었다!

profile
Happy Developer

0개의 댓글