스프링에서 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 |