개발/[Spring] 블로그 만들기

[코드로 배우는 스프링 웹 프로젝트] 3강. Oracle Database 계정 생성 및 프로젝트 JDBC 연결하기 (JDBC 테스트 코드 작성, DB 커넥션 풀 설정)

ee2ee2 2021. 11. 28. 23:06
728x90
반응형

해당 프로젝트는 코드로 배우는 스프링 웹 프로젝트(개정판)을 기반으로 진행됩니다.


이제, 예제에 사용될 데이터베이스의 계정을 생성해 볼 것이다.

Oracle 설치 및 SQL Developer 설치 전이라면, 이 글을 참고하여 설치 후 아래를 진행하면 된다.

 

[Database] Windows Oracle 11g 다운로드 및 SQL Developer 설치하기

이 글에서는 Oracle 11g Express Edition 버전과 SQL Developer 설치방법을 소개한다. Oracle 11g Express Edition 설치하기 1. 아래 주소에서 OS에 맞는 11g Release 2 Express Edition을 클릭 https://www.oracl..

ee2ee2.tistory.com


예제에 사용하는 계정 생성하기

1. 시스템 계정의 텍스트 편집기를 이용하여 아래 정보의 사용자를 생성

사용자 계정 이름 : book_ex (대소문자 주의)
패스워드 : book_ex (IDENTIFIED 뒤에 입력)
기본 테이블 스페이스 : USERS
임시 테이블 스페이스 : TEMP
CREATE USER book_ex IDENTIFIED BY book_ex
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

2. 사용자에 권한 부여하기 

: 오라클의 사용자 계정으로 특정 행위를 하기 위해서 권한이나 롤(Role)이 필요하므로 GRANT 문을 통해 권한 부여

GRANT CONNECT, DBA TO BOOK_EX;


3. 생성한 계정 접속하기

포트의 경우 oracle 설치시 TNS 포트 지정했던 값을 입력하시면 됩니다. (기본 설정은 : 1521)

정상 접속 확인 완료!

 


프로젝트의 JDBC 연결하기

: Oracle 데이터베이스의 JDBC Driver는 11g까지 공식적으로 Maven으로는 지원되지 않기 때문에 예제는 직접 jar 파일을 프로젝트에 추가 시켜줘야 한다.

 

1. SQL Developer 설치 경로의 sqldeveloper\jdbc\lib 폴더에 JDK 8버전용 ojdbc8.jar 파일 존재

(SQL Developer 설치 안했다면, 데이터베이스 oracle 설치 폴더 jdbc\lib에도 존재함)

sqldeveloper\jdbc\lib
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

 

2. STS 접속 후, 예제 프로젝트 선택 > 우클릭 > Properties > Build Path > Libraries > ojdbc8.jar 경로 검색 > ojdbc8.jar 선택 > 열기 > Apply

 

3. Web Deployment Assembly 설정

: 나중에 war 파일로 만들어 질 때에도 jar 파일이 포함될 수 있도록 'Web Deployment Assembly'에도 jar 파일을 추가해야한다.

Web Deployment Assembly > Add > Java Build Path Entried > Next > ojdbc8.jar 선택 > Finish > Apply

적용 완료

 


JDBC 테스트 코드

: JDBC 드라이버가 정상적으로 추가되었고, 데이터베이스의 연결이 가능한지 테스트하는 코드를 작성해본다.

 

1. src/test/java 폴더 하위에 org.zerock.persistence 패키지 생성 > JDBCTests.java 파일 생성

 

2. 데이터베이스 연결 테스트 코드 작성

데이터베이스 연결이 가능하다면 정상적으로 데이터베이스가 연결된 Connection 객체가 출력

데이터베이스 연결 테스트 코드 성공!
참고 자료

JDBCTests.java

package org.zerock.persistence;

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) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void testConnection() {
		try(Connection conn = 
				DriverManager.getConnection(
						"jdbc:oracle:thin:@localhost:1522:xe", //예제용 계정 생성 정보
						"book_ex", 						 	   //ID
						"book_ex")) { 					  	   //Paassword
			log.info(conn);
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
}

 

커넥션 풀(Connection Pool) 설정하기

: 여러 명의 사용자를 동시에 처리해야하는 웹 어플리케이션의 경우 데이터베이스 연결을 이용할 때는 '커넥션 풀'을 이용한다. 커넥션 풀은 여러 종류가 있고, spring-jdbc 라이브러리를 이용하는 방식도 있지만, 예제에서는 HikariCP를 이용해본다.

pom.xml 수정

 : pom.xml의 <dependencies></dependencies> 내 아래 코드 추가 후 저장

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

Maven을 통해 다운받아짐을 확인

root-context.xml 수정

: 스프링에서 'root-context.xml'은 스프링이 로딩되면서 읽어 들이는 파일이므로, 주로 이미 만들어진 클래스들을 이용해서 스프링 빈(Bean)으로 등록할 때 사용한다.

-. 일반적인 상황이라면 프로젝트에 직접 작성하는 클래스들은 어노테이션을 이용
-. 외부 jar 파일 등으로 사용하는 클래스 들은 <bean> 태그를 이용해서 작성하는 경우가 대부분
<?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-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	
	<!-- HikariCP의 bean 설정 -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1522:xe"></property>
		<property name="username" value="book_ex"></property>
		<property name="password" value="book_ex"></property>
	</bean>
	
	<!-- HikariCP configuration -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
		<constructor-arg ref="hikariConfig"/>
	</bean>
	
	<context:component-scan base-package="org.zerock.sample"></context:component-scan>
</beans>

HikariCP에 대한 자세한 설정 방법은 이 곳에서 참고하면 된다!


위 내용을 Java 설정을 이용하는 경우,

/jex00/src/main/java/org/zerock/config/RootConfig.java

: pom.xml에 위와 같이 HikariCP에 대한 내용을 추가해 줘야 한다.

package org.zerock.config;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan(basePackages = {"org.zerock.sample"})
public class RootConfig {

	@Bean
	public DataSource dataSource() {
		HikariConfig hikaariConfig =  new HikariConfig();
		hikaariConfig.setDriverClassName("orcle.jdbc.OracleDriver");
		hikaariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1522:xe");
		hikaariConfig.setUsername("book_ex");
		hikaariConfig.setPassword("book_ex");
		
		HikariDataSource dataSource = new HikariDataSource(hikaariConfig);
		return dataSource;
	}
}

 


여기까지 스프링 동작하는 과정 살펴보기

: 스프링이 시작되면, root-context.xml을 읽어서 아래와 같은 형태로 id가 dataSource인 객체가 처리되게 된다.

hikariConfig가 먼저 생성되고, id가 dataSource인 객체가 hikariConfig값을 참조하여 객체를 생성!

 

테스트 코드를 이용하여 결과 확인하기

DataSourceTests.java

package org.zerock.persistence;

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")
//Java 설정을 사용하는 경우
//@ContextConfiguration(classes = {RootConfig.class})
@Log4j
public class DataSourceTests {
	
	/*
	 * 스프링에 빈(Bean)으로 등록된 DataSource를 이용해서 Connection을 제대로 처리할 수 있는지를 확인해보는 용도
	 * testConnection()을 실행해보면 내부적으로 HikariCP가 시작되고, 종료되는 로그를 확인할 수 있음.
	 */
	
	@Setter(onMethod_ = {@Autowired})
	private DataSource dataSource;
	@Test
	public void testConnection() {
		
		try(Connection conn = dataSource.getConnection()){
			log.info(conn);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
}

 

결과 확인

 

다음 시간에는 MyBatis와 스프링 연동을 진행해볼 것 이다.


HikariCP란?


-. HikariCP란 Springboot 2.0 부터 default로 설정되어 있는 DB Connection Pool로써, Zero-Overhead가 특징으로 높은 성능을 자랑하는 DB Connection Pool이다.
-. HikariCP는 미리 설정한 갯수의 Connection을 Connection Pool에 담아 놓는다.
-. 요청이 들어올 때마다 thread 가 Connection을 요청하고 Hikari는 Connection Pool 내에 있는 Connection을 연결해주는 역할을 한다.

* 참고
https://github.com/brettwooldridge/HikariCP/blob/dev/pom.xml