일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 생성자
- HTML역사
- 함수 선언
- 우아한테크
- 예제
- 숫자 형식
- DoitSQL
- 배열 3요소
- 크롤링
- SQL
- Doit입문SQL
- SQL입문
- R1C3
- 키-값 데이터베이스
- DoitSQL입문
- 숫자형식오류
- 예외
- 페이지분석
- 데이터베이스
- 크롤링 오류
- 배열 예제
- 웹브라우저 수용도
- 자바
- 웹 브라우저 전쟁
- DoIt
- 자바 오류
- dbms
- html
- 함수
- 자바 예외
- Today
- Total
프로그래밍
[Spring] day68 : JDBC Template 본문
2023.08.16.수
JDBC Template
현재의 JDBCUtil은 같은 코드가 계속 반복되고 있다
이를 JDBC Template 패턴을 활용하여 모듈화 / 캡슐화를 할 것이다
DB가 하는일이 주로 정형화된 순서로 진행되기 때문
Template 패턴
=> 유사 / 반복되는 알고리즘을 캡슐화하여 재사용하는 패턴
코딩 순서가 정해져 있는 정형화된 기술에서 특히 유용하게 활용
JDBC, 트랜잭션, Mybatis. JPA, ...
※ 패턴
: MVC, 팩토리(결합도가 낮아짐), 싱글톤(메모리 성능 향상-> 동일한 객체를 하나만 사용)
JDBC Template 클래스 적용하여 구현
먼저 pom.xml에 의존성을 추가해준다
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
DBCP
: DB 커넥션 풀
커넥션(connection)들을 대신 관리해주는 주체(객체)
DB연결은 conn을 DB로부터 확보하는 것에서부터 시작한다
JDBCTemplate 클래스는 ★DataSource 객체★를 통해 conn 확보 및 관리한다
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<context:component-scan base-package="com.spring.biz" />
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="JHYUN"></property>
<property name="password" value="1234"></property>
</bean>
<!-- JdbcTemplate에 의존 주입할 객체 생성 -->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<aop:aspectj-autoproxy />
</beans>
DataSource 객체를 생성을 해야하며
생성은 스프링 컨테이너가 하기 때문에 applicationContext.xml에서 설정한다
위의 코드에서 DataSource 객체 bean 등록시 setter 주입까지 한 것을 확인할 수 있다
@Repository("memberDAO")
public class MemberDAO2 {
@Autowired
private JdbcTemplate jdbcTemplate;
private final String insert = "INSERT INTO MEMBER VALUES(?,?,?,'USER')";
private final String selectOne = "SELECT * FROM MEMBER WHERE MID=? AND MPW=?"; // getOne
private final String selectAll = "SELECT * FROM MEMBER"; // getAll
private final String update = "UPDATE MEMBER SET MPW=?,NAME=? WHERE MID=?";
private final String delete = "DELETE FROM MEMBER WHERE MID=?";
public MemberVO selectOne(MemberVO mVO) {
System.out.println("MemberDAO 로그 selectOne() 메서드");
Object[] args = { mVO.getMid(), mVO.getMpw() };
return jdbcTemplate.queryForObject(selectOne, args, new MemberRowMapper());
}
public List<MemberVO> selectAll(MemberVO mVO) {
List<MemberVO> datas = new ArrayList<MemberVO>();
System.out.println("MemberDAO 로그 selectAll() 메서드");
Object[] args = { };
return jdbcTemplate.query(selectAll, args, new MemberRowMapper());
}
public boolean insert(MemberVO mVO) {
System.out.println("MemberDAO 로그 insert() 메서드");
int rs = jdbcTemplate.update(insert, mVO.getMid(), mVO.getMpw(), mVO.getName());
if (rs <= 0) {
return false;
}
return true;
}
}
class MemberRowMapper implements RowMapper<MemberVO> {
@Override
public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
MemberVO data = new MemberVO();
data.setMid(rs.getString("MID"));
data.setMpw(rs.getString("MPW"));
data.setName(rs.getString("NAME"));
data.setRole(rs.getString("ROLE"));
return data;
}
}
DAO의 클래스의 멤버변수로 JdbcTemplate를 등록하였다
DI(의존주입)는 applicationContext.xml(루트 컨테이너)에서
dataSource 객체를 setter 주입하였다
JDBC Template 메서드
CUD 메서드에서는 .update
selectOne 메서드에서는 .queryForObject
selectAll 메서드에서는 .query 로 실행한다
jdbcTemplate.queryForObject(selectOne, args, new BoardRowMapper());
queryForObject는 upate와 달리 메서드시그니처가 정해져 있다
SQL을 실행할때에 필요한 INPUT과 <<< 배열의 형태
SQL을 실행완료한 후의 OUTPUT을 지정해야한다 << 객체의 형태
https://github.com/jihyean/Spring/tree/main/day68
'자바 > Spring' 카테고리의 다른 글
[Spring] day70 : 예외 발생 처리 페이지 (0) | 2023.08.18 |
---|---|
[Spring] day69 : 파일 업로드 예제 (2) | 2023.08.17 |
[Spring] day67 : AOP 예제(+바인드 변수) (0) | 2023.08.16 |
[Spring] day66 : AOP(관점 지향 프로그래밍) (1) | 2023.08.14 |
[Spring] day64 : 2-Layerd 아키텍처 스타일 (1) | 2023.08.14 |