Day86 - [Spring]Spring JDBC

2021. 6. 18. 00:50Spring

이번에는 Spring JDBC 를 사용 해봅시다.

 

Spring JDBC

Spring JDBC 는 , Database 에 접근하는 라이브러리를 뜻 합니다.

 

이는, java 에서 JDBC 를 사용해 Database 에 접근 했던 적이 있죠? 이제, Spring 에서 접근 하겠다 이겁니다.

 

저는 JAVA 1.8 버전, oracle 12.0 버전을 사용 하고 있습니다.

 

그러기 위해서는 먼저 "pom.xml" 에 아래의 코드를 추가해 줍니다.

아래의 코드는 <dependencies></dependencies> 사이에 추가 해주면 됩니다.

<!-- junit버전을 4.12로 변경 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		
		<!-- 오라클 커넥터 -->        
		<dependency>
		    <groupId>com.oracle.database.jdbc</groupId>
		    <artifactId>ojdbc8</artifactId>
		    <version>19.7.0.0</version>
		</dependency>
		
		<!-- 히카리 커넥션풀 -->
		<dependency>
		    <groupId>com.zaxxer</groupId>
		    <artifactId>HikariCP</artifactId>
		    <version>3.3.1</version>
		</dependency>
		
		<!-- 스프링 JDBC -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>
		
		<!-- 스프링 테스트환경 지원(Junit 단위 테스트 4.12이상 버전과 함께 사용) -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>5.0.7.RELEASE</version>
		    <scope>test</scope>
		</dependency>

위의 코드를 추가했다면, Maven 업데이트 를 해주세요

 

그리고, SQL Developer 에 들어가서, PDB 계정에서 아래의 코드를 추가하고, 실행합니다.

왼쪽 상단의 접속 계정을 추가합니다. 

사용자 이름 : spring

비밀번호 : spring ( 연습용이라서 쉬운 비밀번호를 한 것 )

 

정상적으로 "SPRINGTEST" 계정이 만들어 졌다면, 아래와 같이 폴더 및 파일을 만들어 줍니다.

"hikari.properties" 에는 아래의 코드를 작성 해줍니다.

그리고, "root-context.xml" 파일에서 아래의 코드를 추가 해줍시다.

"root_context.xml" 파일 맨 아래에 있는 Namespaces 탭을 누르고 jdbc 를 체크 합니다.

그러면, "root_context.xml" 파일 상단에 스키마 가 추가된 것을 확인 할 수 있습니다.

이제, "src/test/java" 폴더에 아래와 같은 패키지와 , class 를 만들어 줍니다.

package com.simple.controller;

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

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;

// 필요스펙 - junit 4.12이상, spring-test 라이브러리
@RunWith(SpringJUnit4ClassRunner.class) // was의가동없이 클래스를 실행시켜 줍니다 
@ContextConfiguration("file:src/main/webapp/WEB-INF/config/root-context.xml") // 해당 파일을 스프링설정파일로 참조
public class DatabaseTEST {
	
	@Autowired
	private DataSource dataSource;

	private Connection conn;
	
	@Test // 해당 메서드를 실행
	public void test() {

		try {
			conn = dataSource.getConnection();
			
			System.out.println(conn);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}

해당 파일을 실행 했을 때, 에러 없이 아래처럼 나온다면 성공

이렇게 성공 하셨다면, 성공적으로 database(oracle) 에 접속 한 것 입니다.

 

이제 이를 기반으로 java 에서 사용하던 jdbc 를 사용해 주면 되겠습니다.

 

먼저, 위에서 만든 "SPRINGTEST" 계정에 아래의 테이블과 시퀀스를 추가 합니다.

이제, 이 테이블에 데이터를 추가하고, 데이터를 가져오고, 데이터를 삭제하는 기능을 각각 Dao 에 만들어 줍니다.

 

database 에 데이터 추가

@Override
	public void regist(ScoreVO vo) {

		Connection conn = null;
		PreparedStatement pstmt = null;
		
		String sql = "insert into T_SCORE values(T_SCORE_SEQ.nextval, ?, ?, ?)";
		
		try {
			conn = dataSource.getConnection();
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getName());
			pstmt.setString(2, vo.getKor());
			pstmt.setString(3, vo.getEng());
			
			pstmt.executeUpdate();
			
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
				try {
					if(conn != null) conn.close();
					if(pstmt != null) pstmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
		
	}

database 에 있는 데이터 가지고 오기

@Override
	public List<ScoreVO> getList() {
		
		List<ScoreVO> list = new ArrayList<>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "select * from T_SCORE";
		
		try {
			
			conn = dataSource.getConnection();
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				
				ScoreVO vo = new ScoreVO();
				vo.setBno( rs.getInt("bno") );
				vo.setName( rs.getString("name") );
				vo.setKor( rs.getString("kor") );
				vo.setEng( rs.getString("eng") );
				
				list.add(vo);
			}
			
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
				if(rs != null) rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return list;
	}

database 에 있는 데이터 삭제하기

@Override
	public void delete(int num) {
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		String sql = "delete from T_SCORE where bno = ?";
		
		try {
			conn = dataSource.getConnection();
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, num);
			
			pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn != null) conn.close();
				if(pstmt != null) pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

현재 사용한 database 에 접근 해서 데이터를 추가, 가져오기, 삭제 는 기존에 java 에서 jdbc 를 할 때와 똑같으니 설명은 생략하도록 하겠습니다.

 

spring mvc 구조에 의해서, Controller -> Service -> DAO 순으로 접근하게 됩니다.

 

이 때, Service , DAO 는 각각의 Interface 를 implements 받습니다.