순서
1. JDBC 연결 및 테스트
1.1 Oracle
1.2 JDBC 테스트
2. 커넥션 풀(HikariCP) 설정 및 테스트
3. MyBatis 라이브러리 추가 및 SQLSessionFactory 설정
4. Log4jdbc-log4j2 라이브러리 추가 및 설정
1. JDBC 연결 및 테스트
JDBC란?
Java DataBase Connectivity의 약자로서 자바에서 데이터베이스와 관련된 작업을 처리할 때 사용하는 API이다.
DBMS 종류에 상관없이 하나의 JDBC API를 사용해서 데이터베이스 작업을 처리할 수 있습니다.
JDBC API를 사용하는 애플리케이션의 대략적인 구조는 아래와 같습니다.
자바(웹) 애플리케이션 ▶ JDBC API ▶ JDBC 드라이버 ▶ 데이터베이스
- 자바(웹) 애플리케이션에서 데이터베이스에 접근하기 위해선 JDBC API를 이용해 데이터베이스에 접근합니다.
- JDBC API는 JDBC 드라이버를 거쳐 데이터베이스와 통신합니다.
JDBC 드라이버
자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터입니다.
각각의 DBMS는 자신에게 알맞은 JDBC 드라이버를 제공하고 있습니다.
JDBC 실행 과정
JDBC는 다음의 실행 순서를 가집니다.
1. JDBC 드라이버 Load
2. Connection 객체 생성
3. Statement 객체 생성
4. Query 실행
5. Result 객체로부터 데이터 추출(쿼리 실행 결과 사용)
6. Result 객체 Close
7. Statement 객체 Close
8. Connection 객체 Close
- Connection: DB 연결 객체
- Statement 또는 PreparedStatement 객체: SQL문 실행 객체
- ResultSet 객체: select문 결과를 가지는 객체
위의 객체들은 DB 관련 처리 작업이 완료된 다음엔 반드시 사용했던 객체들을 메모리에서 해제(자원 반납) close()를 해줘야 합니다.
1.1 Oracle
pom.xml 파일에 ojdbc 라이브러리를 추가합니다. JDK 8 혹은 9를 사용 중일 경우 ojdbc8 라이브러리를, JDK10 혹은 11을 사용 중일 경우 ojdbc10 라이브러리를 추가해주어야 합니다.
저는 ojdbc6 라이브러리를 추가했습니다.
Build Path를 통해 직접 라이브러리 추가
SQL Developer를 다운로드하고 압축을 풀어 ojdbc6.jar가 존재하는지 확인합니다.
Package Explorer 창에서 자신이 적용시킬 프로젝트를 선택 후 오른쪽 마우스를 클릭하고, 목록 중 Properties를 클릭합니다. 이후 좌측 목록 중 Java Build Path를 클릭합니다.
상단에 Libraries를 선택한 후 우측에 Add External JARs... 버튼을 클릭합니다.
ojdbc6가 있었던 경로를 찾아서 ojdbc6.jar를 선택한 후 열기(O) 버튼을 클릭합니다.
하단 Apply을 클릭합니다.
이로서 ojdbc6.jar 라이브러리가 해당 프로젝트에 추가되었습니다.
설정 창을 바로 닫지 말고 Deployment Assembly를 클릭합니다.
해당 설정은 프로젝트가. war 파일로 만들어질 때. jar 파일이 포함될 수 있도록 하기 위한 설정입니다.
우측 Add 버튼을 클릭하고 Java Build Path Entries를 클릭합니다.
앞서 추가한 ojdbc6 라이브러리가 뜹니다. 해당 라이브러리를 선택한 후 하단의 Finish 버튼을 클릭합니다.
하단 Apply 버튼을 누르고 Apply and Close를 클릭하면 설정이 완료됩니다.
정상적으로 추가되었는지 확인하기 위해 프로젝트를 열어보면, Referenced Library 목록이 생긴 것을 볼 수 있습니다.
Maven을 통한 라이브러리 추가
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
1.2 JDBC 테스트
추가한 JDBC가 데이터베이스와 연결이 되었는지 확인하기 위해 테스트를 진행합니다.
src/test/java 경로에 com.swan.persistence 패키지를 생성하고 JDBCTest.java 클래스를 생성했습니다.
해당 클래스에 아래의 코드를 추가한 뒤 Junit 테스트를 진행합니다.
Oracle 데이터베이스 계정을 아직 생성하지 않은 경우 생성 후 해당 계정, 비밀번호를 입력하시면 됩니다.
Oracle JDBC 테스트
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch(Exception e) {
e.printStackTrace();
}
}
@Test
public void testConnection() {
try(Connection con =
DriverManager.getConnection(
// Oracle19 버전인 경우 => "jdbc:oracle:thin:@localhost:1521:orcl"
// Oracle11 버전인 경우 => "jdbc:oracle:thin:@localhost:1521:XE"
"Oracle Database url",
"자신의 사용자명",
"사용자 비밀 번호")){
System.out.println(con);
} catch (Exception e) {
fail(e.getMessage());
}
}
추가한 클래스 선택 후 오른쪽 버튼을 누르고 Run As에서 JUnit Test를 선택해 실행시켜봅니다.
2. 커넥션 풀(HikariCP) 설정 및 테스트
커넥션 풀(Connection Pool)이란?
일정량의 Connection 객체(DB 연결 객체)를 미리 만들어 Pool에 저장한다. 프로그램에서 요청이 오면 Connection 객체를 빌려주고, 해당 객체의 임무가 완료되었으면 다시 반납받아 Pool에 저장하는 프로그래밍 기법이다.
1. Pool에서 Connection을 가져온다.
2. Connection을 사용한다.
3. Connection을 Pool에 반환한다.
- 장점: 불필요한 작업(커넥션 생성, 삭제)이 사라지므로 성능 향상을 기대할 수 있다.
- 보통의 DB 접근(JDBC 과정) 경우 객체를 생성한 후 일일이 다시 삭제를 진행해야 한다.
- 커넥션 풀을 사용할 경우 커넥션(Connection) 객체를 미리 만들어 놓고 사용하기 때문에 불필요한 생성과 삭제하는데 드는 비용(메모리 차지)을 줄일 수 있다.
- 단점: 커넥션(Connection) 객체는 적정량만 생성해두어야 한다.
- 너무 많은 DB 접근이 발생할 경우, 커넥션(Connection)은 한정되어 있기 때문에 쓸 수 있는 커넥션(Connection)이 반납될 때까지 기다려야 한다.
- 너무 많은 커넥션(Connection)을 생성할 시 커넥션 또한 객체이므로 많은 메모리를 차지한다. 그렇게 되면 프로그램의 성능을 저하시키는 원인이 될 수 있다.
따라서 사용량에 따라 적정량의 커넥션(Connection) 객체를 생성해두어야 합니다.
라이브러리 추가
커넥션 풀 역할을 하는 라이브러리들 중 HikariCP를 사용합니다.
pom.xml에 HikariCP 라이브러리를 추가해줍니다.
JAVA 8, 9, 10, 11을 사용하는 경우 HikariCP 4.0.2 이상 버전을 사용하면 됩니다.
JAVA 버전에 따른 설치해야 할 HikariCP 버전에 대한 자세한 사항은 다음의 링크를 참고해주세요.
github.com/brettwooldridge/HikariCP
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.2</version>
</dependency>
DataSource 설정 (root-context.xml)
root-context.xml 파일에 아래의 DataSource 설정 코드를 추가합니다.
<!-- DataSource 설정 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"></property>
<property name="username" value="swanshop"></property>
<property name="password" value="swanshop"></property>
</bean>
<bean id="datasource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"></constructor-arg>
</bean>
테스트
스프링 빈(Bean)으로 등록된 DataSource를 이용해서 Connection을 제대로 처리할 수 있는지 확인하기 위해 테스트를 진행합니다.
src/test/java 경로에 있는 com.swan.persistence 패키지에 DataSourceTest.java 클래스를 생성합니다.
해당 클래스에 아래의 코드를 작성한 뒤 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 con = dataSource.getConnection();){
System.out.println("con = " + con);
} catch(Exception e) {
e.printStackTrace();
}
}
}
Spring-Test 오류
오류: SpringJUnit4ClassRunner cannot be resolved to a type
해당 오류가 발생 시 pom.xml의 spring-test 부분에서 <scope>test</scope>을 지우면 됩니다.
3. MyBatis 라이브러리 추가 및 SQLSessionFactory 설정
라이브러리 추가
MyBaits를 사용하기 위해서 mybatis / mybatis-spring / spring-jdbc / spring-tx 4개의 라이브러리가 필요로 합니다.
- mybatis-spring: 스프링에서 MyBaits를 연동시켜주는 라이브러리
- spring-jdbc, spring-tx: 스프링에서 데이터베이스 처리와 트랜잭션 처리를 하는 라이브러리
MyBaits와 무관해 보이지만 추가하지 않는 경우 에러가 발생하기 때문에 추가합니다.
<!-- 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>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
SQLSessionFactory 설정
SQLSession 객체는 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받도록 해줍니다.
이러한 SQLSession을 만들어내는 객체가 SQLSessionFactory입니다.
SQLSessionFactory는 MyBatis-spring 라이브러리 클래스 중 하나입니다.
이 객체를 스프링에서 인식할 수 있도록 root-context.xml 에 빈(Bean)으로 등록합니다.
아래의 코드 작성을 통해서 빈(Bean)으로 등록할 수 있습니다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"></property>
</bean>
테스트
등록한 SqlSessionFactory를 이용해서 SqlSession을 정상적으로 사용할 수 있는지 확인하기 위해서 테스트를 하겠습니다.
기존 DataSource를 테스트를 위해 작성한 DataSourceTest.java 클래스를 활용해서 Junit 테스트합니다.
- SqlSessionFactory 객체를 의존성 주입
- try 파라미터 SqlSession 객체 추가, try 구현부 SqlSession 출력문 코드 추가
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class DataSourceTest {
@Autowired
private DataSource dataSource;
@Autowired private
SqlSessionFactory sqlSessionFactory;
@Test
public void testConnection() {
try(
Connection con = dataSource.getConnection();
SqlSession session = sqlSessionFactory.openSession();
){
System.out.println("con = " + con);
System.out.println("session = " + session);
} catch(Exception e) {
e.printStackTrace();
}
}
}
4. Log4jdbc-log4j2 라이브러리 추가 및 설정
Log4jdbc-log4j2 사용 이유
Log4jdbc는 스프링에서 SQL문을 실행한 로그를 효과적이고 직관적으로 볼 수 있도록 해주는 라이브러리입니다.
Log4jdbc-log4j2 추가 및 설정 방법
Log4jdbc를 사용하기 위해선 라이브러리 추가, 로그 설정 파일 추가, JDBC 연결 정보 설정이 필요합니다.
1) 라이브러리 추가
Maven repository 사이트에서 log4jdbc-log4j2를 검색하시면 Maven 코드를 얻을 수 있습니다.
아래의 코드를 pom.xml 추가합니다.
<!-- 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>
2) 로그 설정 파일 추가
'src/main/resources' 경로에 log4jdbclog4jdbc.log4j2.properties 파일을 생성합니다.
* properties 생성 상세 설명 *
가. 상단 내비게이션 메뉴 중 File 클릭 → New 클릭 → Other 클릭 → General 선택 → Untitled Text File 선택 → Finish 클릭
나. Untitled 번호 창이 뜨면 해당 창에 아래의 코드를 추가하고 Ctrl + s를 눌러 저장
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
다. 파일을 저장해 줄 경로를 지정 후 File name을 log4jdbc.log4j2.properties로 입력 후 OK 버튼 클릭
- 프로젝트 선택 → src → main → resources를 선택
라. 자신이 선택한 경로에 파일이 추가된 것 확인
3) JDBC 연결 정보 설정
root-context.xml 에서 기존 JDBC 드라이버와 URL 정보를 수정해줘야 합니다.
기존에 있던 JDBC 드라이버, URL 정보는 삭제 혹은 주석 처리합니다.
<!-- DataSource 설정 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- <property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"></property> -->
<property name="username" value="swanshop"></property>
<property name="password" value="swanshop"></property>
</bean>
driverClassName는 값을 "net.sf.log4jdbc.sql.jdbcapi.DriverSpy"로 변경해줍니다.
jdbcUrl의 경우, 기존 경로 중간에 log4jdbc 문자열을 추가해주면 됩니다.
변경 후의 코드는 아래와 같습니다.
<!-- DataSource 설정 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- <property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"></property> -->
<!-- Oracle 19c 경우 "jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl" -->
<!-- Oracle 11g 경우 -->
<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="swanshop"></property>
<property name="password" value="swanshop"></property>
</bean>
'😎 STS3 Spring 쇼핑몰 > STS3 Spring 환경 설정 👀' 카테고리의 다른 글
MVC 프로젝트 생성 및 기본 설정 - 3 (0) | 2022.08.11 |
---|---|
MVC 프로젝트 생성 및 기본 설정 - 1 (0) | 2022.08.11 |
Spring 프로젝트 생성 및 환경 설정 (0) | 2022.08.01 |
STS3 Spring & Maven 설치 (0) | 2022.08.01 |