스프링 프로젝트 1일차

BroJang·2022년 10월 31일

스프링

목록 보기
6/10
post-thumbnail

데이터 연동을 위해 jdbc 드라이버 라이브러리 추가

Oracle 버전에 따른 JDBC jar 차이

Oracle DB 21 : ojdbc8(JDK8~JDK15), 11(JDK11~JDK15)
Oracle DB 19 : ojdbc8(JDK8~JDK10), 11(JDK10~JDK11)
Oracle DB 18 : ojdbc8(JDK8~JDK11)
Oracle DB 12.2 : ojdbc8(JDK8)
Oracle DB 12.1 : ojdbc6(JDK6), 7(JDK7~JDK8)
Oracle DB 11.2 : ojdbc6(JDK6~JDK8)

참고 글 : https://oingdaddy.tistory.com/372

Oracle 21c를 사용하기 때문에 ojdbc8을 추가한다.

JDBC DataSource 성능이 hikari가 월등하다는 정보를 접수하였고, 관련 정보들을 찾아본 결과 정보들이 상당수 존재하여 이번 프로젝트에 적용해보기로 하였다.

log4j도 로그를 자동으로 출력해주기 때문에 같이 사용할 예정입니다.(테스트의 이점)

(Oracle + Mybatis + HikariCP)

참고 : 링크
링크2
log4j 특징

<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
		<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<version>21.5.0.0</version>
		</dependency>
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>3.4.2</version>
		</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.3</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.5</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.3.23</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>5.3.23</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>

커서를 artifactId에 갖다대면 지원하는 버전도 표기해주네요

ojdbc8이 범용성이 상당히 넓은 것 같습니다..


DataSource 관련 root-context.xml 설정

<!-- DataSource 설정 -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl"
			value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"></property>
		<property name="username" value="hr"></property>
		<property name="password" value="hr"></property>
	</bean>
	<bean id="datasource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig"></constructor-arg>
	</bean>
	<!-- SQLSessionFactory 설정 -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="datasource"></property>
	</bean>

연동이 정상적으로 되었는지 확인하기 위해 junit을 활용하여 테스트할 예정입니다.

pom.xml에 junit이 있는지 확인

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>

해당 버전이 4.7로 되어있는데 4.12로 변경하였습니다.

Junit : Java에서 독립된 단위 테스트 지원 프레임워크

src/test/java 패키지 밑에 테스트용 신규 패키지를 추가하였습니다.

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

import org.junit.Test;

public class JDBCTest {
	/*
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	*/
	@Test
	public void ConnectTest() {
		try {
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			System.out.println("연결 성공 : " + conn);
			conn.close();
		} catch (SQLException e) {
			System.out.println("연결 실패");
			e.printStackTrace();
		}
	}
}

static을 사용한 이유 : 클래스 로딩 직후 가장 먼저 실행되는 코드

JDBC Driver의 경우 인스턴스가 아닌 클래스에 적용을 시킨다.
DriverManager에 드라이버를 등록하기 위한 static initializer가 필요하다.

※ static initializer : 정적 초기자라고 하는데, 이 영역 내의 코드는 1번만 실행이 된다.
-> 해당 클래스가 객체를 생성하고 static 멤버에 최초로 접근할 때 1번 실행이 됨

※ JDBC 4.0부터는 DriverManager에서 자체 ServiceLoader를 사용하여 Class 경로에서 Driver를 찾기 때문에 굳이 Class.forName을 명시할 필요가 없다.



결과

정상적으로 연결이 된 것을 확인 할 수 있다.


참고 내용
링크 1
링크 2
링크 3
링크 4



dataSource 연결 테스트

테스트를 위해 기존 Test 페이지는 주석처리 후 DataSourceTest Junit 파일 생성

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class DataSourceTest {

	@Autowired
	private DataSource dataSource;

	@Test
	public void testConnection() {
		try {
			Connection conn = dataSource.getConnection();
			System.out.println("연결 여부 : " + conn);
		} catch (SQLException e) {
			System.out.println("에러 :" + e.getMessage());
		}
	}

}

RunWith : Junit Framework Test 방법을 확장하기 위한 Annotation

ContextConfiguration : 어플리케이션 Context 설정파일 위치 지정(RunWith와 함께 사용)
-> 어떠한 파일을 참조할지 모르기 때문에 같이 사용
-> 중괄호를 사용해서 여러 개 설정 가능

Autowired : 의존성 주입
-> DI에서 사용되는 Annotation
-> 스프링에서 Bean Instance 생성 -> @Autowired 메서드 호출 -> 인스턴스 자동 주입
: 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념
-> 생성자, Setter, Field에서 사용

결과 출력

정상적으로 연결 여부 출력이 된 것을 확인

위에 root-context.xml에 mybatis와 sqlSessionFactory를 같이 설정하였다.

여기서 sqlSessionFactory는 MyBatis-spring 라이브러리 중 하나이며, Connection 생성, SQL 전달 및 결과 리턴의 역할을 해준다.

SqlSession 테스트

기존 testConnection 메소드를 활용하였습니다.

	@Test
	public void testConnection() {
    	SqlSession session = sqlSessionFactory.openSession();
		System.out.println("세션 값 : " + session);
    }

결과

나머지는 다음 게시글에 이어서 적도록 하겠습니다.

profile
끊임없이 배우고 진보하는 백엔드 개발자입니다. 배움에 있어서 최선을 다하자!

0개의 댓글