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) {
}
}
}
}
'SPRING' 카테고리의 다른 글
92일차 Spring legact project 생성 순서 (0) | 2023.02.06 |
---|---|
92일차 Spring Mybatis (0) | 2023.02.06 |
90일차 Spring 스프링 MVC웹서비스 (0) | 2023.02.02 |
90일차 Spring MVC Controller객체 구현 (1) | 2023.02.02 |
89일차 Spring MVC Controller객체 구현 (1) | 2023.02.01 |
댓글