[SPRING] 스프링 프레임워크 시작하기-12 [JDBCTemplate /JdbcDaoSupport]

🐷Jinie (juniorDeveloper)·2020년 11월 24일
0

JSP/MVC/SPRING

목록 보기
48/81

1. JDBC Template

  • GoF디자인 패턴 중 템플릿 메서드 패턴이 적용된 클래스
  • 템플릿 메서드 패턴 : 복잡하고 반복되는 알고리즘을 캡슐화해서 재사용하는 패턴으로 정의할 수 있음. 이것을 이용하면 정형화된 반복해서 사용하는 알고리즘에서 유용
  • JDBC처럼 코딩순서가 정형화된 기술에서 유용하게 사용할 수 있음
  • DB 연동 로직은 JDBCTemplate 클래스의 템플릿 메서드가 제공하고 개발자는 달라지는 SQL구문과 설정값만 신경쓰면 됨.
  • JDBC의 반복적인 코드제거를 위해서 제공하는 클래스
  • JDBCTemplate는 내부적으로 JDBC API를 이용하여 실제 DB연동 작업을 처리한다.

2. 스프링 JDBC 이용 라이브러리 추가

  • pom.xml 에 아래코드 추가하기
<!-- Spring -->
		<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>

3. DataSource 설정

  • 추가한 SpringJDBC가 JDBC API를 이용해서 DB연동을 처리하려면 반드시 데이터베이스로부터 커넥션을 얻어야한다.
  • 따라서 객체가 사용할 DataSource를 bean에 넣어주어야한다.
  • destory-method 속성을 이용해서 객체가 삭제되기전에 연결을 해제하고자 close()메서드를 속성으로 지정
  • DataSource 인터페이스를 구현한 클래스는 다양하지만, 일반적으로 많이 사용하는 Apache의 BasicDataSource를 이용해본다.
  • bean을 이용해서 BasicDataSource를 객체로 만들어 추후 사용예정
  • BoardDAOSpring파일에서 setter메서드를 이용해 데이터베이스 연동을 진행할 것이므로
    setter인젝션을 이용한다.
  • setter인젝션의 속성으로 driverClassName, url, username, password 를 차례로 지정해준다.

4. BoardDAOSpring(JdbcDaoSupport클래스 상속이용하기)

  • extends jdbcDAOSupport 클래스를 상속받는다.
  • setsuperDataSource 메서드를 만든다.

4-1. JDBC Template 메서드

  1. update() :
    INSERT, DELETE, UPDATE 쿼리를 사용하기 위해서는 JDBCTemplate의 update()메서드를 이용한다.
    마치, pstmt.executeUpdate(); 와 비슷한 느낌이 들었다.
  • 괄호안의 순서는 (sql구문,물음표값,물음표값...,물음표값)
  • 이 물음표 값을 Object[]배열로 만들어서 한번에 넣어도 된다.


  1. queryForObject() :
    하나의 레코드를 상세보기할때 사용하는 메서드
    SELECT문의 결과를 특정 자바객체로 매핑하여 리턴받을때 사용한다.
    검색결과가 없거나 두개이상이면 예외를 발생시킨다.
  • 검색결과를 넣을 객체를 생성한다.
  • 실행sql구문에 arg객체배열값을 넣어서 만들어둔 리턴전용객체에 값을 세팅해서 넣어준다.
  1. query() 메서드 :
    SELECT문의 실행결과가 목록일때 사용한다.
    결과값은 queryForObject()메서드와같이 특정객체를 만들어 넣어서 리턴해야한다.

전체소스

package com.springbook.k1.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

import com.springbook.k1.common.BoardVO;
@Repository
public class BoardDAOSpring extends JdbcDaoSupport implements BoardDAO{
	@Autowired
	public void setSuperDataSource(DataSource dataSource) {
		super.setDataSource(dataSource);
	}
	private final String sql_insert = "insert into board (seq, title, writer, content) values ((select max(seq)+1 from board), ?,?,? )";
	private final String sql_delete = "delete from board where seq=?";
	private final String sql_update = "update  board set title=?, writer=?, content=? where seq = ?";
	private final String sql_select = "select * from board where seq = ?";
	private final String sql_selectList = "select * from board order by seq asc";
	@Override
	public void insertBoard(BoardVO vo) {
		System.out.println("===> Spring JDBC로 insertBoard()기능 처리하기");
		getJdbcTemplate().update(sql_insert, vo.getTitle(),vo.getWriter(),vo.getContent());
	}

	@Override
	public void updateBoard(BoardVO vo) {
		System.out.println("===> Spring JDBC로 updateBoard()기능 처리하기");
		getJdbcTemplate().update(sql_update,vo.getTitle(),vo.getWriter(),vo.getContent(), vo.getSeq());
	}

	@Override
	public void deleteBoard(int s) {
		System.out.println("===> Spring JDBC로 deleteBoard()기능 처리하기");
		getJdbcTemplate().update(sql_delete,s);
	}

	@Override
	public BoardVO getBoard(BoardVO vo) {
		Object[] args= {vo.getSeq()};
		return getJdbcTemplate().queryForObject(sql_select, args, new BoardRowMapper());
	}

	@Override
	public List<BoardVO> getBoardList(BoardVO vo) {
		return getJdbcTemplate().query(sql_selectList, new BoardRowMapper());
	}
	
	class BoardRowMapper implements RowMapper<BoardVO>{

		@Override
		public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
			BoardVO vo = new BoardVO();
			vo.setSeq(rs.getInt("seq"));
			vo.setTitle(rs.getString("title"));
			vo.setWriter(rs.getString("writer"));
			vo.setContent(rs.getString("content"));
			vo.setRegDate(rs.getDate("regdate"));
			vo.setCnt(rs.getInt("cnt"));
			return vo;
		}
		
	}
	

}
profile
ᴘᴇᴛɪᴛs ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ = ᴘʟᴀɪsɪʀ 💕

0개의 댓글