개발강의정리/Spring

[스프링 부트 개념과 활용] 4-10. 스프링 데이터 3부: MySQL

nineDeveloper 2019. 11. 18.
728x90

스프링 부트 개념과 활용

4. 스프링 부트 활용

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/springboot-concept-uses/tree/chap04-10-03-data-mysql

 

freespringlecture/springboot-concept-uses

백기선님의 스프링 부트 개념과 활용 강의 내용 정리. Contribute to freespringlecture/springboot-concept-uses development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급 프레임워크 및 라이브러리 Spring Spring Boot 온라인 강의

www.inflearn.com

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

10. 스프링 데이터 3부: MySQL

DBCP란 Database Connection Pool
DBCP에서 Database Connection을 만드는 과정이 많은 과정이 일어나는 작업임
그래서 Connection을 미리 여러개 만들어 놓고 필요할때 마다 그때그때 가져다가 쓰도록 하는 개념
Connection 유지 갯수 및 시간 등 여러가지 설정을 할 수가 있음
DBCP가 Application 성능에 아주 핵심적인 역할을 하므로 DBCP에 bug가 있으면 Application에 아주 심각한 문제가 발생함
DBCP에 대해서 충분히 알고 사용을 해야 함

HikariCP 주요 설정 정보

  • https://github.com/brettwooldridge/HikariCP#frequently-used
  • connectionTimeout: 커넥션 타임아웃
  • maximumPoolSize: 커넥션 유지 갯수 Default 10
    • Connection 객체를 몇개를 유지할 것인가 동시에 실행할 수 있는 Connection 수는 CPU Core 갯수와 같음
    • CPU Core를 넘어간 갯수의 객체들은 모두 대기 하면서 타임슬라이싱해서 조금씩 처리함

지원하는 DBCP

SpringBoot는 기본적으로 HikariCP라는 DBCP를 사용함
Hikari DBCP 옵션 값들은 HikariConfig에 정의 되어있음

ex) spring.datasource.hikari.maximum-pool-size=4

  1. HikariCP​ (기본)
  2. Tomcat CP
  3. Commons DBCP2

테스트 코드 작성

Datasource 구현체 mysql-connector-java dependency 추가

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

application.properties 작성

spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=freelife
spring.datasource.password=pass

MySQL 추가 (도커 사용)

Docker kernal을 공유하기때문에 가상머신을 사용할때보다 훨씬 빠르게 Application을 설치할 수 있음

docker container stop

docker stop mysql_boot

docker container delete

docker rm mysql_boot

docker mysql install & run

docker run -p 3306:3306 --name ​mysql_boot ​-e MYSQL_ROOT_PASSWORD=​1​ -e MYSQL_DATABASE=​springboot​ -e MYSQL_USER=​freelife -e MYSQL_PASSWORD=​pass​ -d mysql -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

TIME-ZONE 설정

tzselect

  • 4) Asia
  • 23) Korea (South)
  • 1) Yes

TIME-ZONE 설정확인

select b.name, a.time_zone_id  from mysql.time_zone a, mysql.time_zone_name b where a.time_zone_id = b.time_zone_id and b.name like '%Seoul';

사용자 추가/삭제

전체권한, 로컬호스트에서만 접속 가능

grant all privileges on dbname.* to 유저아이디@localhost identified by '비밀번호';

전체권한, localhost 를 제외한 모든호스트에서 접속 가능

grant all privileges on dbname.* to 유저아이디@'%' identified by '비밀번호';

둘다 가능하게 하려면 둘다 입력해서 권한을 주어야함.

docker mariadb install & run

docker run -p 3306:3306 --name ​mysql_boot ​-e MYSQL_ROOT_PASSWORD=​1​ -e MYSQL_DATABASE=​springboot​ -e MYSQL_USER=​freelife -e MYSQL_PASSWORD=​pass​ -d mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker 인스턴스 보기

docker ps

docker container 안에서 bash 실행

docker exec -i -t mysql_boot bash

mysql 접속 및 데이터베이스 및 테이블 확인

mysql -u freelife -p

show databases;
use springboot;
show tables;

MySQL용 Datasource 설정

spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useSSL=false
spring.datasource.username=freelife
spring.datasource.password=pass

MySQL TimeZone 설정

SET @@session.time_zone = '+9:00';
SET @@global.time_zone = '+9:00';

select @@system_time_zone;
select @@global.time_zone, @@session.time_zone, @@system_time_zone;

권한 설정

CREATE USER 'root'@'%' IDENTIFIED BY 'yourpassword';    
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'  WITH GRANT OPTION;
FLUSH PRIVILEGES;

MySQL 접속시 에러

TIMEZONE 설정 변경

http://ggamu.com/81

my.cnf에 TimeZone 값 Asia/Seoul 로 변경

vi /usr/local/etc/my.cnf

[mysqld]
default-time-zone=Asia/Seoul

mysql 서버 재기동 안되면

sudo chown -R mysql:_mysql /usr/local/var/mysql
sudo mysql.server start

OR

JDBC TimeZone 설정

http://dogcowking.tistory.com/179

jdbc:mysql://ip:port/TestDB?characterEncoding=UTF-8&serverTimezone=UTC

MySQL 5.* 최신 버전 사용할 때

SSL 설정을 하지 않을때 Wanning을 없애기위에 SSL 옵션을 끔

항목 내용
문제 Sat Jul 21 11:17:59 PDT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
해결 jdbc:mysql:/localhost:3306/springboot?useSSL=false

MySQL 8.* 최신 버전 사용할 때

항목 내용
문제 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException : Public Key Retrieval is not allowed
해결 jdbc:mysql:/localhost:3306/springboot?useSSL=false&allowPublicKeyRetrieval=true

MySQL 라이센스 (GPL) 주의

  • MySQL 대신 MariaDB 사용 검토
    • MariaDB 는 상용 소프트웨어가 아니라 무료긴 하지만 GPL2이라서 소스공개 의무가 발생 할 수 있음
  • 소스코드 공개 의무 여부 확인
    • GPL은 소스공개 의무가 있음
728x90

댓글

💲 추천 글