web

코드로 배우는 스프링웹프로젝트 -JDBC테스트코드

늉_늉 2020. 9. 29. 23:59

[ex00 , jex00 공통부분]

 

 

 

프로젝트 한번 클릭후 alt+enter 로 build path

 

add external jar

 

 

ojdb8.jar를 추가해준다.

 

deployment assembly로  add build path 클릭후 ojdbc8추가

 

 

 

 

 

 

JDBC 테스트 코드

 

org.zerock.persistence패키지에 JDBCTests클래스를 추가

 

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 con = 
				DriverManager.getConnection(
						"jdbc:oracle:thin:@localhost:1521:XE",
						"book_ex",
						"book_ex")) {
			log.info(con);
			
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

만약 jex프로젝트 실행시 에러가 난다면 ojdbc8 jar를 확인해 주자

 

 

 

 

 

 

 

커넥션 풀 설정

 

 

여러명의 사용자를 동시에 처리해야 하는 웹 어플리케이션의경우 데이터베이스 연결을 이용할때 커넥션풀(Connection pool)을 이용한다.

 

커넥션풀은 여러종류가 있고, 이 책에서는 HikariCp를 이용한다.

 

 

 

[ex00]

 

 

pom.xml에 아래의코드를 추가해준다.

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

 

 

 

 

root-context.xml코드

 

<?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 -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
		value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521: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>

 

XML 설정 방식을 알아보았으니 이제  Java 설정방식을 알아보자

 

 

 

[jex00]

 

 

Java설정을 이용하는 경우 RootConfig  클래스와 @Bean을 이용해서 처리한다.

 

 

@Bean은 XML 설정에서 <bean> 태그와 동일한 역할을 한다.

 

 

@Bean이 설정된 메서드의 실행결과로 반환된 객체는  스프링의 객체<Bean>로 등록된다.

 

 

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 hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
		hikariConfig.setUsername("book_ex");
		hikariConfig.setPassword("book_ex");
		
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		
		return dataSource;
	}

}

 

 

 

 

 

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

 

 

 

 

 

 

 

 

[ex00]

 

 

package org.zerock.persistence;

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 con = dataSource.getConnection()) {
			log.info(con);
			
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
	
	

}

 

-> 테스트코드는 스프링에 bean으로 등록된 DataSoure를 이용 Connection 을 제대로 처리 할 수 있는지 확인해 보는 용도 

testConnection()을 실행해 보면 내부적으로 HikariCP가 시작되고 종료되는 로그 확인가능

 

 

 

 

 

[jex00]  

 

package zerock.persistence;

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 org.zerock.config.RootConfig;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class}) //Java설정을 이용하는경우
@Log4j
public class DataSourceTests {
	
	@Setter(onMethod_ = { @Autowired })
	private DataSource dataSource;
	@Test
	public void testConnection() {
		try (Connection con = dataSource.getConnection()){
			log.info(con);
			
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
	
	

	
}