자바 Spring

23-02-03) 7-1강 스프링 DB 연동 (MySQL , oracle)

JadeStone 2023. 2. 3. 17:06

<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 (커넥션 풀)

HikariCP

-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>