Flaming Soccer ball
SPRING

91일차 Spring DB 연동

leo lee 2023. 2. 3.
반응형

JDBC

전통적인 JDBC프로그래밍

 

1. Connection 객체 생성

2. PrepareStatement 객체생성

3. SQL문 실행

4. ResultSet객체 생성 결과처리

 

장점: 매우 빠르다(특정 라이브러리 없이 사용 가능)

단점: 너무 반복되는 작업이 계속되는 단점이 있다

 

가장 많이 사용하는 것은 MyBatis

 

Spring-JDBC (JdbcTemplate)

- JDBC의 장점을 유지하면서, 전통적방식의 JDBC단점을 극복하여,

간결한 형태의 API 사용법을 제공하며 기존 방식에서 지원하지 않는 편리한 기능을 제공 

- Spring JDBC는 반복적으로 하는 작업을 대신함

(connection, prepareSatement, resultSet, resultSet의 반복처리, Exception처리) 

- Spring JDBC는 SQL에 바인딩할 값을 지정만 해주면 됨

- Spring JDBC 사용 전 DB커넥션을 가져오는 DataSource가 강제화 됨

 

커넥션 풀

- 여러 명의 사용자를 동시에 처리하는 웹 어플리케이션

- DB연결을 이용할 때 매번 연결하는 방식이 아닌 미리 연결을 맺고 사용하는 Connection Pool을 이용해 성능을 향상시킴

- 커넥션 풀링은 미리 정해진 개수만큼 DB커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때마다 Pool에서 꺼내서 할당하며, 다시 돌려 받아서 Pool에 넣는 기법

- 속도면에서 빠르며, 최근 유행하는 HikariCP 라이브러리 를 사용

DataSource

- DB에 이용되는 URL, id, pw, DriverClass 를 미리 정의해 놓고 사용 하는 객체

- Spring-Jdbc에서 기본으로 제공

- 여러 커넥션풀 라이브러리에서 기본으로 제공

 

 

pom.xml 설정

Mysql Connector 라이브러리

		<!-- mysql 커넥터 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.32</version>
		</dependency>

Spring-JDBC 라이브러리

		<!-- 스프링 jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

 

히카리 라이브러리

		<!--히카리 커넨션 풀 -->
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>3.3.1</version>
		</dependency>

Spring-test(테스트) 라이브러리

		<!--테스트 환경 - spring-test 모듈 and junit기능 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
			<scope>test</scope>
		</dependency>

		<!-- test 버전은 최소 4.12이상 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

 

 

DataSource설정

DataSource와 HikariCP 빈으로 등록

 

 

	<!-- 데이터 베이스 정보는 외부 파일로 관리 -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location"
			value="classpath:/DB-config/hikari.properties"></property>
	</bean>

	<!-- Root Context: defines shared resources visible to all other web components -->
	<!--데이터 베이스 설정 -->

	<bean id="hikari" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="${ds.driverClassName}"></property>
		<property name="jdbcUrl" value="${ds.jdbcUrl}"></property>
		<property name="username" value="${ds.username}"></property>
		<property name="password" value="${ds.password}"></property>
	</bean>

	
	<!-- <bean id="hikari" 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="jsp"></property> <property name="password" 
		value="jsp"></property> </bean> -->

	<!-- 데이터 베이스 정보를 주입 -->
	<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikari"></constructor-arg>
	</bean>

 

 

데이터 베이스 연동을 통해  DAOIMPL을 수정함

package com.simple.score.service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.simple.command.ScoreVO;

@Repository("yyy")
public class ScoreDAOImpl implements ScoreDAO {

	@Autowired
	private DataSource dataSource;

	@Override
	public void regist(ScoreVO vo) {

		String sql = "insert into score (name, kor, eng) values (?, ?, ?)";

		Connection conn  = null;
		PreparedStatement pstmt = null;
		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 (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn!=null) conn.close();
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {

			}
		}
	}

	@Override
	public ArrayList<ScoreVO> getList() {

		ArrayList<ScoreVO> list = new ArrayList();

		String sql = "select * from score order by num desc";

		Connection conn  = null;
		PreparedStatement pstmt = null;

		ResultSet rs = null;//데이터를  

		try {
			conn = dataSource.getConnection();
			pstmt = conn.prepareStatement(sql);


			rs    = pstmt.executeQuery(sql);
			while(rs.next()) {
				ScoreVO vo = new ScoreVO();
				vo.setNum(rs.getInt("num"));
				vo.setName(rs.getString("name")); //column
				vo.setKor(rs.getString("kor"));
				vo.setEng(rs.getString("eng"));
				
				list.add(vo);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn!=null) conn.close();
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {

			}
		}

		return list;
	}

	@Override
	public void delete(int num) {
		String sql = "delete from score where num=" + num;

		Connection conn  = null;
		PreparedStatement pstmt = null;


		try {
			conn = dataSource.getConnection();
			pstmt = conn.prepareStatement(sql);


			pstmt.executeUpdate(sql);
			

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn!=null) conn.close();
				if(pstmt!=null) pstmt.close();
			} catch (Exception e2) {

			}
		}

		
	}

}
반응형

댓글