본문 바로가기

SPRING

Connection Pool / DataSource / JdbcTemplate / RowMapper

스프링에서 JDBC를 활용하여 DB 연동할 때 이해가 필요한 용어들을 정리해보자.

Connection Pool

기존에 DB에 접근 하려면 접근할 때마다 connection을 맺고 끊는 작업을 했어야했다.

하지만, 스프링에서는 다양한 라이브러리를 제공하여 이를 쉽게 할 수 있다.

미리 커넥션을 생성해 두고, DB에 접근하려는 사용자에게 미리 생성된 커넥션을 제공하고 다쓰면 돌려받는다.

이때, 연결이 끊어지는 것은 아니다. 반납하는 것 뿐. 이러한 커넥션들이 모아진 곳을 커넥션 풀이라고 한다.

 

사용자의 요청 시에 커넥션을 연결하는 것이 아니라 미리 일정 수의 커넥션을 만들어 놓고 빌려주는 것

커넥션을 갑작스럽게 많이 사용하게 될 경우 미리 설정된 최대 커넥션 수만큼 증가하다록 하여 원활한 서비스가 되도록 한다.

 

 

DataSource

커넥션 풀의 Connection을 관리하기 위한 객체, 인터페이스.

이 객체를 통해 커넥션을 얻어오고 반납하고 함.

 

DataSource 기능을 제공하는 모듈

- C3P0 -> DataSource를 구현한 ComboComboPooledDataSource 클래스 제공

- DBCP

 

<!-- DB 연결을 위한 dataSource 객체에 값들을 주입 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
	<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> 
	<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
	<property name="user" value="springuser"/>
	<property name="password" value="1234"/>
    
	<!-- 커넥션 풀 추가 옵션 사항 (선택적) -->
	<property name="maxPoolSize" value="100"/> <!-- 커넥션 풀 최대 몇 개까지 만들래? -->
	<property name="maxIdleTime" value="600"/> <!-- 풀을 600초 동안 사용하지 않으면 해제시키겠다 -->
	<property name="idleConnectionTestPeriod" value="300"/> <!-- 커넥션을 300초마다 접속 테스트 -->
</bean>


<!-- DAO 객체에 DB 연결 정보 주입 -->

<bean id="memberDao" class="spring.MemberDAO">
	<constructor-arg ref="dataSource"/>
</bean>

 

커넥션 풀 옵션 사항

initialPoolSize : 초기 커넥션 풀 크기 (defalut 3)

maxPoolSize : 커넥션 풀 최대 크기 (default 15)

minPoolSize: 커넥션 풀 최소 크기 (defalut 3)

maxIdleTime : 사용되지 않는 커넥션 해제 시간 (defalut 0 : 제거하지 않음)

checkoutTimeout : 커넥션을 가져올 때 대기 시간 (defalut 0 : 계속 기다림)

idleConnectionTestPeriod : 커넥션 풀의 커넥션 테스트 주기 (defalut 0 : 검사하지 않음)

 

 

JdbcTemplate

DB 연동 기능을 가진 클래스.

Connection 열고 닫기 / Statement 준비, 실행, 닫기 / ResultSet 처리 / Exception 처리, 반환 / Transaction 처리 / 리소스 생성, 해지

쉽게 말해, SQL 조회, 갱신, 저장 절차에 모두 관여한다. 즉, 쿼리를 날려주는 클래스.

 

update() 메서드

- 반환값 0 / 리턴값 없이 실행만 할 때

- insert / update / delete SQL문 실행

 

public void update(Member member) {
		jdbcTemplate.update(
				"update member set name = ?, password = ? where email = ?",
				member.getName(), member.getPassword(), member.getEmail());
		}
        
        
public void insert(Member member) {
		jdbcTemplate.update(
				"insert into member values (MEMBER_SEQ.nextval, ?, ?, ?, ?)",
				member.getId(), member.getEmail(), member.getPassword(), 
				member.getName(), member.getRegisterDate());
		}
        
public void delete(String email, String password) {
		jdbcTemplate.update(
				"delete member where email = ? and password = ?", email, password);
		}

 

 

queryForObject() 메서드

- 반환값 1 / 리턴값이 딱 하나

- select 문으로 하나의 row를 가져올 때

 

public int count() {
		Integer cnt = jdbcTemplate.queryForObject(
			"select count(*) from member", Integer.class);
		return cnt;
}

 

 

query() 메서드

- 반환값 1개 이상 / 0개 안됨 절대!

- select 문으로 여러 개의 row를 가져올 때

 

public Member selectByEmail(String email) {
		List<Member> result = jdbcTemplate.query(
				"select * from member where email=?", new MemberRowMapper(), email);
		return result.isEmpty() ? null : result.get(0);
	}	
	

public List<Member> selectAll() {
		List<Member> result = jdbcTemplate.query(
				"select * from member", new MemberRowMapper());
		return result;
	}

 

 

RowMapper

- 미리 만들어두면 객체를 리턴하는 경우에 모두 사용할 수 있음

- while(rs.next()) { } // rs에 저장된 VO 하나(=한 줄)의 값을 저장, 계속 돌면서 계속 저장

  -> JSP에서 while문이 하는 일을 직접 해주는 인터페이스, 스프링 자체에서 처리해줌

 

- ResultSet에서 값을 가져와 원하는 타입으로 매핑할 때 사용

   public interface RowMapper {

             Object mapRow(ResultSet rs, int rowNum) throws SQLException;

   } // resultSet에 저장된 다중 데이터를 조회할 때 ArrayList형태로 구성하기 위해 사용

 

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class MemberRowMapper implements RowMapper<Member> {

	@Override
	public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
		Member member = new Member(
				rs.getString("EMAIL"),
				rs.getString("PASSWORD"),
				rs.getString("NAME"),
				rs.getTimestamp("REGDATE"));
		member.setId(rs.getLong("ID"));
		return member;
	}

}

'SPRING' 카테고리의 다른 글

자바 request 객체의 메서드  (0) 2020.09.30
트랜잭션  (0) 2020.09.29
XML 파일 생성하는 법  (0) 2020.09.28
AOP - Around를 적용한 예제  (0) 2020.09.25
AOP 적용 - After, Around, Afterreturning, Afterthrowing  (0) 2020.09.24