스프링 06. JDBC Template로 바꾸기
- 참조
- JdbcTemplate 클래스
- JDBC의 반복적인 코드를 제거하기 위한 클래스
- 반복되는 DB 연동 로직은 JdbcTemplate 클래스의 템플릿 메소드가 제공
- 개발자는 SQL구문만 신경쓰면 됨
- 데이터베이스와의 연결 코드를 Java로 작성하지 않음
- root-context.xml에 저장된 것을 사용하여 데이터베이스 연결
- DBCP : 자바 웹 애플리케이션에서 DB 접속과 관련된 라이브러리 중 하나
- JDBC : Java DataBase Connectivity, DB연결 인터페이스로 각 DB의 Driver를 통해 접속
- DB 접속을 위한 JDBC 드라이버 로드
- getConnection Method로 DB 커넥션 객체 얻음
- PreparedStatement 객체 생성
- executeQeury를 실행해서 결과 얻음
- close
- DBCP : DataBase Connection Pool, DB와 Connection을 맺고 있는 객체를 관리하는 역할
- WAS 실행시 일정량의 DB Connection 객체 생성 -> Pool에 저장
- DB연결요청 -> Pool에서 가져다 사용후 반환
- DBCP 옵션
- maxActive : 동시에 사용할 수 있는 최대 커넥션 개수
- maxIdle : Connection Pool에 반납할 때 최대로 유지될 수 있는 Connection 개수
- minIdle : 최소한으로 유지할 Conneciton 개수
- initialSize : getConnection() 메소드를 통해 Connection Pool에 채워 넣을 최소 커넥션 개수
- JDBC : Java DataBase Connectivity, DB연결 인터페이스로 각 DB의 Driver를 통해 접속
- pom.xml에 라이브러리 추가
- DBCP 라이브러리 추가 : <dependency> 코드 찾기, http://search.maven.org 접속하여 commons-dbcp 검색
123456<!-- DBCP --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency> - spring-orm과 spring-jdbc 라이브러리 추가
123456789101112<!-- spring-ORM --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${org.springframework-version}</version></dependency><!-- spring jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${org.springframework-version}</version></dependency>
- DBCP 라이브러리 추가 : <dependency> 코드 찾기, http://search.maven.org 접속하여 commons-dbcp 검색
- DataSource 설정
- property 파일을 place holder를 통해 DataSource의 속성으로 설정한 후 해당 BasicDataSource(DataSource Interface 중 하나)를 통해 bean으로 등록
- property 파일의 위치 지정
- 반드시 필요한 parameter를 속성으로 설정
- 해당 datasource를 bean으로 등록
- /webapp/WEB-INF/spring/root-context.xml 코드 추가
123456789101112131415<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"><!-- Root Context: defines shared resources visible to all other web components --><!-- Sqlite --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="org.sqlite.JDBC"/><property name="url" value="jdbc:sqlite:mybook.db" /><property name="username" value=""/><property name="password" value=""/></bean></beans>
- property 파일을 place holder를 통해 DataSource의 속성으로 설정한 후 해당 BasicDataSource(DataSource Interface 중 하나)를 통해 bean으로 등록
- JdbcTemplate 객체 생성
- /bookapp/dao/book/폴더의 파일 중 @Repository는 1곳에만 있어야 함
- /bookapp/dao/book/BookDAOJDBC 클래스에서 @Repository 제거한 후
- /bookapp/dao/book/BookDAOTemplate 클래스 생성
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071package krco.moak.bookapp.dao.book;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import krco.moak.bookapp.dto.book.Book;@Repositorypublic class BookDAOTemplate implements BookDAO{@Autowiredprivate JdbcTemplate jdbcTemplate;private final String BOOK_INSERT = "INSERT INTO book(no, title, pric, publ) "+ " VALUES((SELECT max(no)+1 FROM book),?,?,?);"; // AUTOINCREMENT 기능 직접 추가// Oracle, H2에서 NVL(인자1, 인자2) 인자1이 null일 경우 인자2를 사용하겠다는 뜻// MySql, Sqlite에서는 ISNULL()private final String BOOK_UPDATE = "UPDATE book SET title=?, pric=?, publ=? WHERE no=?;";private final String BOOK_DELETE = "DELETE FROM book WHERE no=?;";private final String BOOK_GET = "SELECT * FROM book WHERE no=?;";private final String BOOK_LIST = "SELECT * FROM book ORDER BY no DESC;";@Overridepublic int insert(Book vo) {System.out.println("===> Spring JdbcTemplate 사용");return jdbcTemplate.update(BOOK_INSERT, vo.getTitle(), vo.getPric(), vo.getPubl());}@Overridepublic int update(Book vo) {System.out.println("===> Spring JdbcTemplate 사용");return jdbcTemplate.update(BOOK_UPDATE, vo.getTitle(), vo.getPric(), vo.getPubl());}@Overridepublic int delete(Book vo) {System.out.println("===> Spring JdbcTemplate 사용");return jdbcTemplate.update(BOOK_DELETE, vo.getNo());}@Overridepublic Book getOne(Book vo) {System.out.println("===> Spring JdbcTemplate 사용");Object[] args = {vo.getNo()};return jdbcTemplate.queryForObject(BOOK_GET, args, new BookRowMapper());}@Overridepublic List<Book> getAll() {System.out.println("===> Spring JdbcTemplate 사용");return jdbcTemplate.query(BOOK_LIST, new BookRowMapper());}class BookRowMapper implements RowMapper<Book> {public Book mapRow(ResultSet rs, int rowNum) throws SQLException {Book book = new Book();book.setNo(rs.getInt("no"));book.setTitle(rs.getString("title"));book.setPric(rs.getInt("pric"));book.setPubl(rs.getString("publ"));return book;}}}
- 결과 확인
- DB 연결정보를 별도의 파일에 저장하여 사용하는 방법
- DB와의 연결을 위한 DB Server에 관한 정보(Property)를 설정
- driver, url, username, password 등을 지정
- /resources/config/database.properties 파일 생성 후 코드 추가
1234jdbc.driver=org.sqlite.JDBCjdbc.url=jdbc:sqlite:mybook.dbjdbc.username=jdbc.password=
- property 파일을 place holder를 통해 DataSource의 속성으로 설정한 후 해당 BasicDataSource(DataSource Interface 중 하나)를 통해 bean으로 등록
- property 파일의 위치 지정
- 반드시 필요한 parameter를 속성으로 설정
- 해당 datasource를 bean으로 등록
- /webapp/WEB-INF/spring/root-context.xml 코드 수정
-
1234567891011121314151617181920212223242526<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- Root Context: defines shared resources visible to all other web components --><!-- Sqlite --><context:property-placeholder location="classpath:config/database.properties"/><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- Spring JDBC 설정 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>
- DB와의 연결을 위한 DB Server에 관한 정보(Property)를 설정
- ..
- ..