헬린코린이

[Spring Framework] JdbcTemplate 본문

Programming/Spring Framework

[Spring Framework] JdbcTemplate

HCD 2023. 3. 13. 02:10

JdbcTemplate은 개발자가 JDBC 기술을 쉽게 사용할 수 있도록 도와주는 클래스이다.

그럼 JDBC는 무엇인가 간단하게 알아보고 넘어가자

 

JDBC란 Java Database Connectivity로 

자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.

이러한 JDBC는 데이터베이스에서 자료를 쿼리 하거나 업데이트하는 방법을 제공합니다.

스프링의 가장 기본적인 Data Access 탬플릿으로 쿼리 기반으로 데이터 베이스의 접근이 가능합니다.

DAO계층에서 Jdbc Template API를 사용합니다.

 

Data Source 란

 - DB Server와 연결 시키는 연결 팩토리이고

 - JDBC의 일부분입니다.

 - Connection의 정보를 가지고 있고 Bean으로 등록하여 인자를 넘겨줍니다.

 - DB Connection Pooling 기능을 갖고 있고

 - 기본적으로 BasicDataSource를 사용합니다.

모든 영속성 프레임워크는 내부적으로 JDBC API를 이용합니다.

종류로는

 - SQL Mapper: Mybatis, Ibatis, JDBC Template

 - ORM : JPA, Hibernate이 있습니다.

 

다시 돌아와

JdbcTemplage 의 사용법을 알아보겠습니다.

스프링 프레임워크에서 사용해볼것입니다

우선 pom.xml에 추가할 것이 몇 가지 있습니다.

     <!-- JDBC : MySQL -->
      <dependency>
         <groupId>com.mysql</groupId>
          <artifactId>mysql-connector-j</artifactId>
          <version>8.0.31</version>
      </dependency>
      <dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<version>8.0.28</version>
	  </dependency>

MySQL을 상요하겠다라는 dependency를 추가해줘야 하고

<!-- 필요한 것 1) DBCP 객체:  JDBCUtil에서의 역할을 담당하는 객체 
	미리 pool에 conn을 확보해둘수있고 사용자가 요청할때마다 바로바로 객체제공 가능 -->
	<!-- connection을 확보해둔 pool을 확보해서 여기에서 conn,disconn을 관리할수있게 할 예정 -->
      <dependency>
         <groupId>commons-dbcp</groupId>
         <artifactId>commons-dbcp</artifactId>
         <version>1.4</version>
      </dependency>
      
    <!-- 필요한 것 2) Spring에서 제공하는 JDBC를 사용하겠다는 설정 -->
	      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>${org.springframework-version}</version>
      </dependency>

2가지가 필요한데 JDBCUtil에서의 역할을 담당하는 객체와

Spring에서 제공하는 JDBC를 사용하겠다는 설정입니다.

 

그러고 나서 applicationContext.xml로 와서  조금 설정을 해줘야 하는데

	<!-- Conn객체를 확보하는것이 어떤 JDBC에서든지 중요한 포인트이다! -->
	<!-- 스프링 JDBC에서는 Conn객체를 확보하는 역할을 담당하는 친구이름이 "DataSource" -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName"
			value="com.mysql.cj.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost/sondb" />
		<property name="username" value="root" />
		<property name="password" value="1234" />
	</bean>
	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>

이렇게 설정해 주고

	@Autowired
	private JdbcTemplate jdbcTemplate;

 

DAO 클래스에서 @Autowired로 의존주입해 주면 JdbcTemplate 사용 준비는 완료되었다.

 

원래 JdbcTemplate을 쓰지 않는 DAO를 보면

public boolean insert(MemberVO mvo) { 
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(INSERT);
			pstmt.setString(1, mvo.getId()); 
			pstmt.setString(2, mvo.getPw());
			pstmt.setString(3, mvo.getName()); 
			pstmt.setString(4, mvo.getPhone()); 
			int res=pstmt.executeUpdate();
			if(res<=0) {
				return false;
			}
		} catch(SQLException e) {
			e.printStackTrace();
			return false;
		}
		JDBCUtil.disconnect(conn, pstmt);
		return true;
	}

이렇게 코드가 엄청 길어졌다 JDBC를 연결해 주고

INSERT SQL문을 실행하고 

JDBC를 연결해제를 해줘야 했다.

 

하지만 JdbcTemplate를 쓰면

 

 

public boolean insert(MemberVO vo) {
		jdbcTemplate.update(SQL_INSERT, vo.getId(), vo.getPw(), vo.getmName(), vo.getPhone());
		return true;
	}

이렇게 insert문이 간결해지는 장점이 있다.

또한 selectAll, selectOne이나 결과를 불러와야 하는 메서드 같은 경우에는

public MemberVO selectAll(MemberVO vo) {
		try {
			MemberVO mvo = jdbcTemplate.query(SELECTALL, new MemberRowMapper());
			return mvo;
		} catch(Exception e) {
			e.printStackTrace();
			return null;
		}
	}

MemberRowMapper를 인스턴스화한걸 query인자에 넣어주게 되면

SELECTALL 쿼리가 실행된 결과를 MemberRowMapper() 클래스 즉 RowMapper인터페이스를 구현한 MemberRowMapper()

클래스에서 결과를 객체로 담아 반환하게 된다.

class MemberRowMapper implements RowMapper<MemberVO> {
	@Override
	public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
		MemberVO data=new MemberVO();
		data.setId(rs.getString("ID"));
		data.setPw(rs.getString("PW"));
		data.setmName(rs.getString("MNAME"));
		data.setmPhone(rs.getString("PHONE"));
		return data;
	}
}

 

 

 

JdbcTemplate에는 

update, query, queryForObject,... 이 있는데

 

update는 SQL 연산을 통해 데이터베이스를 갱신시켜 줄 때 사용하는 메서드입니다.

query는 많은 결과 값을 처리할 수 있는 메서드입니다.

queryForObject는 하나의 객체 결과 값이 나올 때 사용하는 메서드입니다.

queryForInt는 Integer타입의 결과 값을 가져올 때 사용하는 메서드입니다.

Comments