지금까지 나는 spring 프로젝트에 h2를 연결해서 쓰고 있었다.
spring 공부를 시작하며 구글링하며 나온 여러 사이트와 강의들에서 H2 DB를 쓰는 곳이 많았기 때문에 별 생각 없이 H2를 사용해왔던 것 같다.
프로젝트가 어느정도 진행되면서 AWS 이야기가 나왔는데
AWS를 쓸려면 H2는 DB로 사용하지 못한다고 하는 것 같다...?!
그래서 이참에 DB를 mySql로 바꿔보기로 하였다.
MySQL를 공부하기 전 모르는 용어가 있어 정리하고 넘어가자
-DBMS (Database Management System)
데이터베이스를 관리하고 운영하는 소프트웨어. 대표적으로 MySql이나 H2 같은 것들이 있음.
MySQL을 설치를 하고 시작해보자
본인은 mac homebrew를 이용해 설치했다.
1. mysql에 접속
mysql 기본값으로 user는 root 비번은 없는 걸로 설정 되어있는 듯하다.
-u : user / -p : password
$ mysql -uroot -p
Enter password: /*mysql 설치 때 입력했던 비밀번호*/
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 8.0.30 Homebrew
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2. 데이터베이스 생성
나의 DB이름은 내 프로젝트 이름인 JMC이다 (점심메뉴추천의 약자이다)
JMC가 잘 추가 된것이 보인다.
mysql> CREATE DATABASE JMC
-> DEFAULT CHARACTER SET UTF8;
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| JMC |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
3. 유저 생성 후 권한 부여
본인은 이 과정에서 문제가 생겨 나중에 MySQL 연동이 안되서 생기는 에러인
Access denied for user 'sejoon'@'#' (using password: YES)
를 만나게 된다.
많은 구글링 끝에 (using password:YES) 가 비밀번호가 틀렸을 경우 생기는 오류인 것을 알았고
기존 비밀번호였던 'mysql' 에서 숫자를 넣어준 'compact20'으로 해주었더니 성공했다.
참고 했던 블로그에서는 이런 에러가 떴었다는데 나는 이런 에러가 뜨지 않았다...
Consider using a password with 8 or more characters with mixed case letters, numbers and punctuation marks.
권한 부여 방법
//사용자 생성
CREATE USER 'sejoon'@'#'
-> IDENTIFIED BY 'compact20';
// DB 권한 부여
GRANT ALL PRIVILEGES
-> ON *.*
-> TO 'sejoon'@'#';
4. 테이블 생성
Member 테이블을 하나 만들어보았다.
BIGINT: 8bytes
NOT NULL : null 값이면 안됨.
AUTO_INCREMENT : 데이터가 추가 되면 자동으로 ID가 1씩 증가하는 것을 의미
VARCHAR(200) :
변동 문자열이라는 것이고 200bytes로 제한한다는 것인데, VARCHAR는 2자로 들어오면 공간을 2bytes만 차지한다.
반면에, CHAR(200)은 고정 문자열로 2자가 들어와도 200bytes를 다 쓴다.
mysql> CREATE TABLE IF NOT EXISTS JMC.MEMBER (
-> ID BIGINT NOT NULL AUTO_INCREMENT,
-> NAME VARCHAR(200),
-> EMAIL VARCHAR(200),
-> PROFILEIMAGEURL VARCHAR(200),
-> PRIMARY KEY(ID)
-> );
Query OK, 0 rows affected (0.02 sec)
지금까지는 terminal로 해봤고 이제는 Data Grip을 써서 하자.
Data Grip
1. MySQL 연동
왼쪽 상단에 +버튼 누르고 dataSource -> MySQL을 들어간다.
그리고 깔라는거 있으면 깔고 (경고 표시로 밑에 문구로 나와있다)
Name: 맘대로
User: 아까 만든 User (sejoon)
비번: 아까 비번
@localhost 옆에 버튼 클릭하면 내가 보고 싶은 DB 고를수 있다
2. 테이블 만들기
아까 만든 MEMBER도 테이블에 잘 들어가 있다.
tables 파일 우클릭해서 새테이블을 만들어보자
이번에는 ROOM 테이블을 만들어보자
PK: ID
columns:
name, password, leaderID
를 가지는 테이블이다
column과 pk를 다 추가해주면
sql문이 자동으로 짜져서 밑에 Preview 나오게 된다.
테이블은 이런 방식으로 개인 프로젝트의 만들어야되는 것들이 다 만들어주면 된다.
SpringBoot
1. 의존성 추가
본인은 Gradle을 사용한다.
implementation 'mysql:mysql-connector-java'
2. application.properties 설정
server.address=localhost
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/DB이름?useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=user이름
spring.datasource.password=비번
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# mysql 사용
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# 하이버네이트가 실행한 모든 SQL문을 콘솔로 출력
spring.jpa.properties.hibernate.show_sql=true
# SQL문을 가독성 있게 표현
spring.jpa.properties.hibernate.format_sql=true
# 디버깅 정보 출력
spring.jpa.properties.hibernate.use_sql_comments=true
3. 실행해보자!
이 상태로 SpringBoot를 실행하면 에러가 뜬다...
SQLSyntaxErrorException : Table 'test_db.hibernate_sequence' doesn't exist
hibernate_sequence라는 테이블에서 PK를 조회하는데 해당 테이블이 존재하지 않아서 발생한다고 한다.
MEMBER의 @GeneratedValue(strategy = GenerationType.IDENTITY)로 바꿔주면 된다
이것은 기본 키 생성을 데이터베이스에 위임한다는 것이다.
쿼리가 잘 insert 되는 모습이다.
중간에 query는 잘 날라가는데 table에 데이터가 추가 되지 않아 굉장히 당황하고 있었는데
application.properties 에서
spring.datasource.url=jdbc:mysql://localhost:3306/데이터베이스 이름?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
데이터 베이스 이름을 내 DB이름인 JMC가 아닌 Test_DB로 해놓고 있었다... 삽질 하...
정상적으로 적어주면 kakao OAuth에서 받아온 내 유저 정보가 table에 정상적으로 꽂힌게 된다.
오늘은 H2 DB에서 MySQL로 DB를 바꾸어 보았다.
익숙하지 않아 중간중간 에러도 많이 만나고 막막한 경우도 있었지만 바꾸고 보니 뿌듯하다...
이로써 드디어 H2에서 벗어났다..!
참고
https://velog.io/@rladuswl/MySQL-%EC%97%B0%EB%8F%99-%EC%97%90%EB%9F%AC
https://memostack.tistory.com/155#1.4.%20%ED%85%8C%EC%9D%B4%EB%B8%94%20%EC%83%9D%EC%84%B1
https://deeplify.dev/database/troubleshoot/public-key-retrieval-is-not-allowed
https://hack-cracker.tistory.com/165
'spring' 카테고리의 다른 글
[spring security] 왜 500번 에러도 401(Unauthorized)에러가 될까? (0) | 2024.04.07 |
---|---|
이미지 저장/조회 서버 만들기(3) - AWS Presigned URL 이미지 업로드 (0) | 2024.02.26 |
이미지 저장/조회 서버 만들기(2) - 이미지 파일 어떻게 받아오지? (0) | 2024.02.12 |
이미지 저장/조회 서버 만들기(1) - 저장 어디에..? (0) | 2024.02.11 |
SpringBoot + JPA + postgreSQL 프로젝트를 docker를 이용해 fly.io로 배포해보자 - 1부 (0) | 2023.01.20 |