개발이야기/Spring

[Code Lean Spring Web] 3. 스프링과 Oracle DataBase 연동

cafe-jun12 2019. 11. 17. 16:00
반응형

 

이번 블로그에서는 Spring과 Oracle Database 연동에 대해서 살펴보겠습니다. 

스프링과 연동할 Oracle Database를 설치해야하는데 엔터프라이즈 버전은 용량이 커 부담이 될수가 있으므로 개인 프로젝트에 부담이 없는 11g express 설치를 권장합니다. 설치는 다음 URL 을 참고하시면 될거 같습니다. 

 

Oracle 11g Express Install : https://jink1982.tistory.com/4

 

그리고 11g Express의 기본 포트는 8080이므로 Tomcat Server와 충돌이 일어납니다. 다음 페이지를 참조하여 Oracle Database의 기본 포트를 변경을 해주시면 됩니다. 

 

Oralce 11g Express Port 변경 : https://leeyongjin.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-11g-express%EC%97%90%EC%84%9C-8080-%ED%8F%AC%ED%8A%B8-%EB%B3%80%EA%B2%BD

 

Oracle Database가 Spring 과 연결을 하려면 JDBC 드라이버가 필요합니다. pom.xml에 다음 라이브러리를 추가합니다.

	<!-- dependencys 테그 안에 -->
    <!-- odbc 6-->
		<dependency>
		    <groupId>com.oracle</groupId>
		    <artifactId>ojdbc6</artifactId>
		    <version>11.2.0.3</version>
		</dependency>
    <!-- dependencys 테그 밖에 -->    
	<repositories>
		<repository>
			<id>Spring Plugins</id>
			<url>http://repo.spring.io/plugins-release/</url>
		</repository>
	</repositories>	

 

com.oracle<ojdbc6> 라이브러리는 dependencys 태그 안해 작성을 해야하고 repositories 의정보는 dependencys 밖에 작성을 해야합니다. (dependencys 태그 바로 아래 작성하는것이 가독성을 위해 좋습니다). JDBC 드라이버가 정상적으로 추가 되었다면 데이터베이스에 연결이 가능한지 테스트를 해야합니다. 

 

JDBC 테스트

테스트 코드가 있는'src/test/java' 안에 com.exe.jdbctest.JDBCTests 클래스를 생성합니다. 

package com.exe.jdbctest;

import static org.junit.Assert.fail;

import java.sql.Connection;
import java.sql.DriverManager;

import org.junit.Test;

import lombok.extern.log4j.Log4j;

@Log4j
public class JDBCTests {

	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
	@Test
	public void testConnection() {
		try {
        	//oracle 접속 url
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			//oracle 접속 계정 
           	 String username = "cafejun";
            //oracle 계정 패스워드 
			String password = "dkagh1";
			Connection conn = DriverManager.getConnection(url,username,password);
			log.info(conn);
							  
		} catch (Exception e) {
			fail(e.toString());
		}
	}
}

 테스트 코드는 Java와 JDBC 드라이버만으로 구현해서 먼저 테스트를 해야합니다. 데이터베이스 연결이 가능하다면 정상적으로 Connection 객체가 다음과 같이 출력이 됩니다. 

 

 

DB 접속 성공

 

 

커넥션 풀 설정


일반적으로 여러명의 사용자를 동시에 처리해야하는 웹 어플리케이션의 경우 데이터베이스를 연동할때 커넥션 플을 이용하는것이 좋습니다 Java 에서는 Datasource라는 인터페이스를 통해서 커넥션 풀을 사용합니다. DataSource를 통해 매번 데이터베이스와 연결하는 방식이 아닌 미리 연결을 맺어주고 반환하는 구조를 가지고 있어 성능 향상에 도움을 줍니다. 

 

ConnectionPool

미리 커넥션을 생성하여 웹 브라우저의 요청이 있을때마다 커넥션을 할당을 해주기 때문에 요청일 있을때마다 커넥션을 생성하여 할당을 해주는 기존의 방식 보다 부하 및 성능적인 면에서도 다수의 요청을 받을때는 커넥션 풀을 사용하는것이 좋습니다.

 

커넥션 풀은 여러가지가 있고 common-dbcp 라이브러리를 이용하는 방식이 있지만 요즘 꽤 괜찮은 커넥션 풀인 HikariCp를 이용해 보겠습니다. 

 

HikariCp Maven : https://mvnrepository.com/artifact/com.zaxxer/HikariCP/3.3.1

 

pom.xml을 수정해서 HikariCP를 추가합니다. 

	<dependency>
		    <groupId>com.zaxxer</groupId>
		    <artifactId>HikariCP</artifactId>
		    <version>3.3.1</version>
	</dependency>

다음으로 root-context.xml 안에 설정은 직접 <bean> 태그를 정의해서 작성 합니다. <bean>태그 내에는 <property>를 이용해서 여러 속성에 대해 설정할수가 있습니다.

 

HikariCp : https://github.com/brettwooldridge/HikariCP

 

를 참고하여 작성을 합니다(HikariCp 설명을 보면 기존의 커넥션 풀을 보다 성능이 우수하다고 나와 있는것 같습니다.)

 

<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<!-- Root Context: defines shared resources visible to all other web components -->
	<context:component-scan base-package="com.exe.sample"/>
	
	<bean id="hikariConfig" 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="cafejun"/>
		<property name="password" value="dkagh1"/>
	</bean>
	<!-- HikariCP 설정  -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
		<constructor-arg ref="hikariConfig"/>
	</bean>

</beans>

root-context.xml 

 

HikariCP 사용하기 위해서 root-context.xml을 다음과 같이 설정을 했습니다. 스프링은 root-context.xml를  스프링이 로딩 되면서 읽어드리는 파일이므로 주로 이미 만들어진 클래스들을 이용해서 스프링의 빈(Bean)으로 등록할때 사용합니다. 다음으로 DataSourceTests 클래스를 만들어 테스트를 해보겠습니다. 

 

DataSource 위치 

'src/test/java' 안에 com.exe.sample.DataSource. 클래스 파일을 만들어서 아래와 같이 테스트코드를 작성해 보았습니다.

package com.exe.sample;

import static org.junit.Assert.fail;

import java.sql.Connection;

import javax.sql.DataSource;

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;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
	@Setter(onMethod_ = {@Autowired})
	private DataSource dataSource;	
	@Test
	public void testConnection() {	
		try {
			Connection conn = dataSource.getConnection();
			log.info(conn);
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}	
}

 DataSourceTests.java

 

 

다음 테스트코드는 스프링에 Bean 으로 등록된 DataSource를 이용하여 Connection 을 제대로 처리를 할수가 있는지 테스트 하는 용도로 사용이 됩니다. TestConnection 을 실행해 보면 HikariCP가 시작이 되고 종료가 되는 코드를 확인할수가 있습니다. 

 

HikariCP 로그 

 

이번시간에는 Spring과 오라클 데이터 베이스를 연동해보는 것에 대해 살펴 보았습니다. 

반응형