Connecting to database...
java.sql.SQLException: No suitable driver found for jdbc:mysql://서버주소.com:3306/test
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at Main.main(Main.java:26)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.sql.Connection.rollback()" because "conn" is null
at Main.main(Main.java:59)
Process finished with exit code 1
자바에서 mysql을 연결 시에는 MySQL Connector/J 외부 라이브러리 디펜더시(의존성)가 필요합니다.
만약 의존성이 설치되어 있지않으면, 당연히 MySQL과 어떻게 연결할지에 대해 모르기 때문에 에러가 발생하면서 연결이 되지 않습니다.
하지만 메이븐과 그래들에는 의존성을 코드 한줄만 입력하면 우리가 만든 프로젝트에 저절로 필요한 플러그인, 라이브러리 등을 알아서 다운로드 하여 적용 시켜 줍니다.
** BEGIN NESTED EXCEPTION **
javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify
STACKTRACE:
javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:838)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:817)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:2249)
at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4221)
at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1464)
at Main.main(Main.java:52)
** END NESTED EXCEPTION **
Process finished with exit code 0
위 경고(에러)가 뜨지만, sql 조회는 되는 경우가 있습니다.
어찌됐든간에 조회가 됐으니 넘어갈수도 있지만, 왜 SSLException가 뜨는지 궁금합니다.
문서를 살펴보니, 서버가 SSL을 사용하도록 올바르게 구성된 한, 커넥터/J 클라이언트에서 암호화된 연결을 사용하도록 구성할 필요가 없습니다(예외는 커넥터/J가 5.6.25 이전 또는 5.7.5 버전을 쓰는 경우, 혹은 MySQL 서버 버전)
즉 5.6.25 혹은 5.7.5 이전 버전의 외부라이브러리를 사용하게 되면 SSL를 사용된 SQL서버에 접속시에는 설정을 구성할 필요가 있다고 합니다.
jdbc:mysql://localhost:3306/test?verifyServerCertificate=true&useSSL=true&requireSSL=true
추가로 connect버전을 올려도 똑같은 에러메시지가 뜨셨다면, openjdk를 사용하셔서 그럴 수 있습니다.
https 접속 시 javax.net.ssl.SSLException: java.lang.RuntimeException: 에러 발생 원인
트랜잭션이란?
- 테이블 내용을 변경하는 SQL들이 연달아 실행되며, 마치 하나의 SQL처럼 다 같이 성공하던지 아니면 실패해야 한다면 트랜잭션의 사용이 필수!
- Atomic(하나의 시퀀스)하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법
- DDL이나 DML 중 레코드를 수정/추가/삭제 한 것에만 의미가 있음.
- SELECT에는 트랙잭션을 사용할 이유가 없음.
- BEGIN과 END 혹은 BEGIN과 COMMIT 사이에 해당 SQL들을 사용
- ROLLBACK
트랙잭션 예시
BEGIN; -- START TARNSACTION
A의 계좌로부터 인출;
B의 계좌로 입금;
END; -- COMMIT
이 동작은 autocommit 모드에 따라 달라짐.
autocommit = True // ON
autocommit = False // OFF
-- autocommit 작동 방법
SHOW VARIABLES LIKE 'AUTOCOMMIT';
-- autocommit 변경 방법
SET autocommit = 0 --(혹은 1)로 작동 변경가능
DELETE FROM vs TRUNCATE 차이
View란?
자주 사용하는 SQL 쿼리(SELECT)에 이름을 주고 그 사용을 쉽게 하는 것
- 이름이 있는 쿼리가 View로 데이터베이스단에 저장됨.
- SELECT 결과가 테이블로 저장되는 것이 아니라 View가 사용될 때마다 SELECT가 실행됨.
- 때문에 가상 테이블이라고 부르기도 함(Virtual Table)
- CREATE OR REPLACE VIEW 뷰이름 AS SELECT ...
Stored Procedure란?
View의 가상테이블처럼 MySQL 서버단에 저장되는데, View보다 훨씬 강력한 기능 제공
프로그래밍 언어의 함수처럼 인자를 넘기는 것이 가능, INOUT 지원
리턴되는 값은 레코드들의 집합
간단한 분기문(if, case)과 루프(loop)를 통한 프로그램이 가능
디버깅이 힘들고 서버단의 부하를 증가시킨다는 단점 존재
- 정의 문법
DELIMITER // CREATE PROCEDURE procedure_name(parameter_list) BEGIN statements; END // DELIMTER;
DELIMITER 다음에 나오는 문자(//)는 $$등 아무거나 해도 됨.
다음 문자(//) 나올때까지 안에 내용을 Sotred 저장해서 사용한다는 의미
- 호출 문법
CALL stored_procedure_name(argument_list);
Stored function이란?
Trigger이란?
CREATE TRIGGER 트리거이름
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name FOR EACH ROW
trigger_body;
-- EXPLAIN
EXPLAIN SELECT
-- 서술
-- 테이블 생성하면서 하는 방법
CREATE TABLE example (
id int not null auto_increment,
index_col VARCHAR(20),
PRIMARY KEY(id),
INDEX index_name(index_col)
);
-- 생성된 테이블을 ALTER로 수정하면서 하는 방법
ALTER TABLE testalter_tbl ADD INDEX(column1);
키워드에 대해서 제시할 뿐, 따로 상세하게 정리하지는 않았다.
주말을 이용해서 SQL 책을 하나 다 보고나서, 다시 글에 살을 붙일 예정이다.
오 mysql connector 버전에 따라서 ssl 관련 인증서가 누락 됐을 때 생성하는 경우도 있네요.
상원님한테 ssl 관련 exception 말씀드리고 나서 8버전 쓴다고 왜 에러가 해결됐지? 라는 생각을 해봤는데 궁금증이 해결됐습니다! 감사합니다