프로그래밍

[Spring] day68 : JDBC Template 본문

자바/Spring

[Spring] day68 : JDBC Template

시케 2023. 8. 17. 22:33
728x90
반응형

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

 

728x90
반응형
Comments