GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the DataBase

JAVA => JDBC => MySQL DB 연동

Backcoder 2022. 7. 18. 13:27

< Java => JDBC => DB 연동 >

- JDBC : JAVA의 DB 연결 기술 + API 들
기본적으로 DB 와 연결할 때 자바는 JDBC 를 사용한다.

- java.sql.* 인터페이스 사용
=> 각 DB에 맞도록 구현(implements)해둠 : 각 DB 드라이버
- 각 DB 별 JDBC 전용 driver 프로그램 필요
- 모든 DB에 대해 JDBC 는 동일하게 동작
( db 종류, ip port 번호 정도만 바뀜 )

- JDBC 연결 순서 ( 동일 )
1. JDBC driver 호출 ( MySQL => connector J )
2. DB 연결 ( 종류, ip, port, 계정, 암호 )
3. SQL문 정의- 전송
4. DB 연결해제

(MySQL은 기본적으로 컴퓨터 시작하면 자동 실행되게 설정되어 있음 )
(제어판 - 관리도구 - 서비스 - MySQL - 시작 자동)
( H2 같은 DB는 직접 실행해줬어야 한다. )


< JDBC 연결 코드 >
( 세팅 자체는 모든 DB에 공용, 드라이버나 DB명, user id,pw 등 교체해서 사용 )


[ Connection pooling ]
: Tomcat WAS => Connection pooling 기능 사용 ( Connection 미리 담아놓기 )

=> DB Connection 최대접속허용 갯수 정해서 내부에 "미리" 생성해두고 사용.
서버에서 보관하다가 요청이 있을 때 마다 빌려주고 반납하고 반복 ( pool 인력대기소 )



1.  MVC 각 프로젝트별 :  Servers - context.xml  => Resource(env) 추가 

톰캣 자체에 추가해두기 : Tomcat config 폴더=> context.xml 에 Resource(env) 추가 

 


<Resource
name="jdbc/backdb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/backcoder"
username="backcoder"
password="1111"
maxActive="5" maxIdle="3" maxWait="-1"
/>

2. DAO => 만들어둔 Resource(env) 가져다 쓰기


try {
Context initcontext = new InitialContext();
Context envContext = (Context) initcontext.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/backdb");
Connection con = ds.getConnection();


// connection 객체 사용해서 sql 문 사용

} catch ( Exception e) { e.printStackTrace(); }
finally { try { con.close(); } catch ( Exception e) {} }



----------------------------------------------------------------------
< Connection Pooling >
=> DataSource 이용해서 DB 연동 하는 방식이다.
1. JDBC 드라이버 설치가 먼저 되어있어야 하고,
2. ConnectionPool 기능관련 jar파일들 필요
: javax.sql.DataSource 풀링제공해주는 라이브러리
: javax.naming.Context 톰캣 설정 읽어오는 라이브러리
=> 톰캣서버에 내장되어 있음! ( 개꿀 )
: tomcat-dbcp.jar ( 위 라이브러리들 상속받은 클래스 dbConnectionPooling )

- context.xml 에 connection pooling을 설정함으로 써, db 정보도 드러내지 않을 수 있다.




*주의 : 아래는 매번 요청이 들어올 때 마다 Connection 을 생성해서 연결하는 방법
( 그냥 Connection 만 1000번 연결해줘 라는 요구만 하더라도 처리에 10초이상이 걸리고, 그 동안 다른 처리를 못한다. )
- 게다가 코드에서 db 정보도 노출된다.
=> Conncection pooling 을 사용해야 한다! ( 혹은 Application Properties 설정 )

( 기본적으로 매번 호출해서 연결하는 방법은 아래와 같다. )

Connection con = null; // 기본으로 Connection 변수 하나 전역으로 만들어두고 사용

1. JDBC driver 호출 ( 라이브러리에 추가 되어있는지 확인 )
try{ Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("드라이버 호출 완료");
} catch (ClassNotFoundException e) {
System.err.println("JDBC 드라이버를 로드하는데에 문제 발생" + e.getMessage());
e.printStackTrace(); }
2. DB 연결
try { con = DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/memberDB", "root", "1111");
// ("jdbc:mysql://아이피:포트/디비", "계정", "비번");

System.out.println("DB 연결 성공");
} catch(SQLException e) {
System.err.println("연결 오류" + e.getMessage());
e.printStackTrace(); }

3. SQL문 사용
String query = "intsert into member"
+ " values( 'id100', 1234, '김사원', '010-1234-1234', 'kim@mem.net', now())";

4. DB연결해제
//1~4 한번에 실행할 때, 위에서 어떻게 되든 finally 줘서 close 는 꼭 해주기
finally{
try {
con.close();
System.out.println("연결 해제 성공!"); }
catch (SQLException e) {}
}


- MySQL 외부연결 허용은 최대치가 제한되어있다. ( 100여개 )
=> 항상 DB 다 사용하고 나서는 접속 종료 close(); 를 꼭! 해줘야한다
=> finally 로 항상 접속 끊어주기


< 연결 해제 한방에 >
try{ Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("드라이버 호출 완료");
} catch (ClassNotFoundException e) {
System.err.println("JDBC 드라이버를 로드하는데에 문제 발생" + e.getMessage());
e.printStackTrace(); }

Connection con = null;
try { con = DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/memberdb", "june", "1111");
System.out.println("연결 완료!");

//SQL

}catch(SQLException e) {
System.err.println("연결 오류" + e.getMessage());
e.printStackTrace(); }
finally {
try {con.close();
System.out.println("연결 해제 성공!"); }
catch (SQLException e) {}
}

---

- 이론적으로는 이렇게 JAVA 에서 코드로, create 등 DDL쿼리도 수행 가능
- BUT 보안 등 문제로 DDL은 DB 자체에서 사용 권고
( 동시작업 문제 )
- [ DB연결 - SQL문 사용 - DB연결해제 ] 코드를 세트로 사용하면,
매번 쿼리문 사용할 때 마다 연결하고 해제하면서 사용 된다.





< MySQL - Java SpringBoot 연동 > ( Intelli J )
- 스프링 부트로 프로젝트 생성할 때, mysql driver / Spring data jpa 라이브러리 추가 하면 편함

1. MySQL 드라이버 등록 ( Connector j )
MySQL installer - Connector j 설치

Java ( 오른쪽위 설정아이콘 ) project structure - libraries - 추가(+)
- connector j 폴더 ( program files(x84) 루트로 자동저장된다 ) - connector java(JAR) 파일
찾아서 추가

( 이클립스 )
Properties - java build path - libraries - add exernal jar - connector j (jar)

2. application properties 에 Mysql 관련, hibernate , sql 관련 특성들 추가
( mysql url - 포트번호, 사용할 db지정,
username, password, driver 등 지정 )




< MySQL Application properties >

- Spring 환경에서는 properties 설정으로 자동으로 연결

# MySQL8 설정
spring.datasource.url=jdbc:mysql://localhost:3306/스키마명?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=아이디
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 콘솔에 SQL 출력 여부
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

# hibernate 설정
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.generate-ddl=false
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true


- application properties 에 위와 같이 기본 설정을 넣어두면
위에서 코드로 했던 드라이버 호출 ~ DB 접속을
설정해둔 디비, 유저, 비밀번호로 자동으로 수행한다.