23-02-03) 7-1강 스프링 DB 연동 (MySQL , oracle)
<MySQL 데이터베이스 설치>
※ MySQL 설치 파일은 community 버전(무료) 를 다운 받았음.
*순서
custom->
server, workbench 선택 ->
root비민번호-> 1234
-> 설치
-삭제(설치 파일 다시 실행)
-프로그램 삭제
- programfile, programfile x86, program data 세군대의 폴더에서 남아있는 찌꺼기 삭제
------------------------------------------------------------------------------------------------------------------------------------------
오라클 설치
sqldeveloper
mysql
workbench
cutom 항목 체크해서 아래와 같이 들어오기.
위와같이 체크해 놓고 next 그리고 설치.
비밀번호는 1234로 했음.
계속 넘어가고나서 finish
정보확인.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
# Root(오라클의 sys) 계정 내에서 데이터 베이스 스키마 생성
*sys 스키마는 사용 안 하고 우리 스키마 새로 만듦.
-구문 실행 키는 ctrl + enter
#계정생성
#계정 생성 - 아이디 spring, 비밀번호 spring
create user 'spring' identified by 'spring';
spring 이라는 user에 비밀번호를 spring 로 한다.
# 권한
# 권한
grant all privileges on spring.* to 'spring';
spring 스키마에 'spring' 계정에 all privileges (모든권한)을 부여한다.
확인
위에 창 끄고
계정 새로만들기로 .
Store in Vault 누르고 지정해놨던 비밀번호 spring 입력해주면 됨.
------------------------------------------------------------------------------------------------------------------------------------
<table 생성>
#구문으로 생성
# 오라클의 타입 -> MySql타입
# varchar2 -> varchar
# number(10) -> int(8) 여기서 8은 바이트의 크기 int로만 치면 가장 큰 바이트로 자동으로 지정됨.
# date -> date or timestamp (timestamp는 시분초까지 다 표현해줌)
# 시퀀스 -> auto_increment
# 함수 -> 구글에 찾아봄
# 조인 -> 완벽동일
# 서브쿼리 ->
# mysql은 version별로 대소문자를 구분할 수도 있고, 구분을 안할 수도있음.
create table score(
num int primary key auto_increment,
name varchar(30) not null,
kor int default 0,
eng int default 0
);
drop table score;
#마우스로 테이블 생성
# select
*select 절을 통해 테이블 확인 후
마우스를 통해 직접 데이터를 테이블에 써넣어줄 수 있음 . 그리고 나서 우측에 Apply 클릭.
select * from score;
insert into score(name, kor, eng) values ('홍길자', 30, 30);
#서브쿼리 절
*오라클과의 차이점은 서브쿼리 절을 사용할 때
A 이렇게 테이블 엘리어스가 필수로 들어가야 함.
select A.*
from (select *
from score) A;
---------------------------------------------------------------------------------------------------------------------------------------------------------------
<데이터베이스 연결>
#JDBC
*JDBC란
자바에서 DB 프로그래밍 사용하기 위해 이용하는 API
* 장점은 가장 낮은 레벨의 언어를 사용하기 때문에 속도가 제일 빠름.
단점은 너무 반복되는 작업이 계속된다는 것.
*JDBC 참고링크 :
https://shs2810.tistory.com/18
#커넥션 풀
미리 연결객체를 만들어 놓고 필요할 때 연결해서 사용.
*DataSource
- DB에 이용되는 URL, id, pw, DriverClass를 미리 커넥션풀에 정의해 놓고 사용하는 객체
# 필요한 라이브러리들 maven repository 싸이트에서 찾아서 porm.xml에 가져오기
*mysql Connector
*Spring-JDBC
*히카리 CP (커넥션 풀)
-test 환경을 위해서는 아래 모듈2개 필요-
*spring-test모듈
*junit
porm.xml 에 추가한 부분
<!-- pom.xml에서 사용할 변수들 -->
<!-- 자바버전 11, 스프링버전 변경 -->
<properties>
<java-version>11</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- ㅡmysql 커넥터 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!-- 스프링 jdbc 모듈 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version> <!-- 스프링 버젼 찾아가지고 맞춰주기 -->
</dependency>
<!-- 히카리 커넥션 풀 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
<!-- 테스트환경 - spring-test모듈 and junit기능 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version> <!-- 스프링 버젼 찾아가지고 맞춰주기 -->
<scope>test</scope>
</dependency>
<!-- Test 버젼은 최소 4.12이상-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
#root-context.xml에 데이터베이스에대한 전역설정을 해줘야함
*Namespaces 에서 jdbc 체크
root-context.xml 파일
- HikariConfig 라는 객체에 데이터 베이스를 연결하는 내용들을 담아줌. 이 객체를 hikari 라고 이름붙임.
-HikariDataSource (커넥션 풀에 담겨있는 객체?) 라는 객체에 생성자 주입으로 윗줄의 hikari 객체를 넣어줌.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 데이터베이스 설정 -->
<bean id="hikari" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul"/>
<property name="username" value="spring"/>
<property name="password" value="spring"/>
</bean>
<!-- 데이터베이스 정보를 주입 -->
<bean class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikari"/>
</bean>
</beans>
하지만 데이터 베이스의 설정 정보는 이렇게 노출해서 적으면 안됨.
외부에 파일을 따로두고 정보를 관리해야함.
위와같이 자바/리소스 영역 -> src/main/resources 에
DB-config 라는 폴더를 만들고 확장자가 properties 라는 hikari 파일을 만들었음.
* hikari.properties 파일
- ## 은 주석임
- 데이터베이스 정보를 기록함
## mysql database info
ds.driverClassName=com.mysql.cj.jdbc.Driver
ds.jdbcUrl=jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
ds.username=spring
ds.password=spring
* root-context.xml 파일의 내용 변경
- 위에 데이터정보를 기록해놓은 파일을 참고하기위한 객체를 빈으로 생성
hikari.properties 파일의 경로 맨 앞에
classpath:/ 는 자바/리소스 경로, 즉 자바의 src/main/resources 경로를 가르켜줌.
-hikari.properties 파일의 정보를 참조할 때는
${키값} 으로 해주면 됨.
<!-- 데이터베이스 정보는 외부 파일로 관리 -->
<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:/DB-config/hikari.properties" />
</bean>
<!-- 데이터베이스 mysql로 설정 -->
<bean id="hikari" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="${ds.driverClassName}" />
<property name="jdbcUrl" value="${ds.jdbcUrl}" />
<property name="username" value="${ds.username}" />
<property name="password" value="${ds.password}" />
</bean>
<!-- 데이터베이스 정보를 주입 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikari" />
</bean>
*Hikari connection pool 의 주요 옵션들.
# 데이터 베이스가 잘 연결됬는지 TEST
*test를 시행할 클래스 생성
* test.java (테스트 파일)
-클래스 위에 테스크 환경을 구성해주는 어노테이션을 달아준다.
@RunWirth(SpringJUnit4ClassRunner.class) -> 스프링 프레임워크가 독립적으로 시행되도록 구동환경 설정
@ContextConfituration("경로") ->사용할 스프링 설정 파일 경로 지정
@RunWith(SpringJUnit4ClassRunner.class)//junit으로 테스트환경을 구성
@ContextConfiguration("file:src/main/webapp/WEB-INF/config/root-context.xml")//동작시킬 스프링 설정파일
public class JDBCTest {}
-실행할 메서드 위에 붙는 어노테이션들
@BeforeClass //해당 클래스에서 단 한번 실행 -static
예시) public static void loadTest() {} -> @BeforeClass 는 이렇게 메서드에 static이 붙어야함.
@Before //각 테스트 코드를 실행하기 전에 우선실행
@Test //test코드로 실행함
- JDBCTest.java (테스트 파일 코드)
package com.simple.basic;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)//junit으로 테스트환경을 구성
@ContextConfiguration("file:src/main/webapp/WEB-INF/config/root-context.xml")//동작시킬 스프링 설정파일
public class JDBCTest {
// @BeforeClass //해당 클래스에서 단 한번 실행 -static
// public static void loadTest() {
// System.out.println("beforeClass");
// }
//
// @Before //각 테스트 코드를 실행하기 전에 우선실행
// public void testCode00() {
// System.out.println("before");
// }
@Autowired
DataSource dataSource;
@Test //test코드로 실행함
public void testCode01() {
try {
//DataSource에서 conn객체 얻음
Connection conn = dataSource.getConnection();
System.out.println(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
*테스트 실행
-테스트 클래스 실행 전 서버를 끄고, 위와 같이 실행
-결과
데이터 베이스가 잘 연결 되었음을 확인.
------------------------------------------------------------------------------------------------------------------------------------------------------
#오라클 연결시에는 아래 라이브러리를 이용하면 됨.
* 데이터 베이스를 오라클로 연결해주고자 한다면
root-context.xml (데이터베이스 설정) 파일에서
커넥션 풀의 빈 생성 부분에 연결하는 데이터베이스 정보를 오라클의 내용으로 연결시켜 주면 됨.
<!-- 데이터베이스 오라클로 설정 -->
<!-- <bean id="hikari" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="jsp" />
<property name="password" value="jsp" />
</bean> -->
<!-- 데이터베이스 정보를 주입 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikari" />
</bean>