210 likes | 461 Views
Chapter 06 데이터베이스 연동 지원. 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26. 목차. 스프링의 데이터베이스 연동 지원 DataSource 설정 스프링의 JDBC 지원 iBATIS / 하이버네이트 /JPA 연동 지원. 1. 스프링의 데이터베이스 연동 지원. 1. 스프링의 데이터베이스 연동 지원. 중복된 코드 제거를 위한 템플릿 클래스 제공 ( GoF 의 템플릿 패턴 ) Connection conn = null; … try {
E N D
Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일: 2009.08.26
목차 • 스프링의 데이터베이스 연동 지원 • DataSource설정 • 스프링의 JDBC 지원 • iBATIS/하이버네이트/JPA연동 지원
1. 스프링의 데이터베이스 연동 지원 • 중복된 코드 제거를 위한 템플릿 클래스 제공(GoF의 템플릿 패턴) • Connection conn = null; • … • try { • conn = getConnection(); • stmt = conn.createStatement(); • rs = stmt.executeQuery(“…”); • } catch(SQLException e) { • … • } finally { • … • if(conn != null) conn.close(); • } • DaoSupport: DAO에서 사용하는 기본적인 기능을 제공, 상속받아서 사용 • 구체적인 Exception을발생시킴
2.1. 커넥션 풀을 이용한 Datasource설정 <bean id="dataSource” class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost/test" p:userName="test" p:password="1234" /> • dataSource : DAO가 데이터에 접근하기 위한 포인트 • DBCP(Jakarta Commons Database Connection Pool) API(connection library) 이용
2.2. JNDI를 이용한 DataSource설정 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-j22-2.5.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/guestbook" resource-ref="true" /> <!– JNDI에서 객체를 검색하는 위치 : java:comp/env/jdbc/guestbook --> <bean id="messageDao" class="MessageDao" p:dataSource-ref="dataSource" /> </beans> • JEE App server, Tomcat, Resin 등 web container 사용하는 경우 <jee:jndi-lookup> 태그 사용하여 JNDI에 등록된 객체명 명시
2.3. DriverManager를 이용한 DataSource설정 <bean id=“dataSource“ class=“org.springframework.jdbc.dataSource.DriverManagerDataSource” p:driverClassName=“com.mysql.jdbc.Driver” p:url=“jdbc:mysql://localhost/test” p:username=“test” p:password=“root” />
2.4. DataSource로부터 Connection 구하기 public class JdbcMessageDaoomplementsMessageDao { private DataSourcedataSource; public void setDataSource(DataSourcedataSource) { this.dataSource=dataSource; } @Override public intselectCount() { Connection conn=null; try { // conn=dataSource.getConnection(); conn=DataSourceUils.getConnection(dataSource); } finally { // JdbcUtils.closeConnection(conn); datasourceutils.releaseConnection(conn,dataSource); } } } • DataSource로부터 Connection 구하기 • getConnection() 활용하면 되나 스프링이 제공하는 트랜잭션 관리 기능 활용할 수 없음 • 이를 방지하기 위해 DataSourceUtils클래스를 이용하여 connection을 구하고 반환함.
3.1. JdbcTemplate클래스를 이용한 JDBC 프로그래밍 <bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” p:driverClassName=“com.mysql.jdbc.Driver” p:url=“jdbc:mysql://localhost/test” p:username=“test” p:password=“1234” /> <bean id=“jdbcTemplate” class=“org.springframework.jdbc.core.JdbcTemplate” p:dataSource-ref=“dataSource” /> <bean id=“messageDao” class=“JdbcTemplateMessageDao” p:jdbcTemplate-ref=“jdbcTemplate” /> jdbcTemplate p:dataSource-ref messageDao p:jdbcTemplate-ref dataSource
3.1. JdbcTemplate클래스를 이용한 JDBC 프로그래밍 private static final String SELECT_SQL = "select * from GUESTBOOK desc limit ?,?"; public List<Message> selectList(intpage,int size) { List<message> list=jdbcTemplate.query(SELECT_SQL,new Object[] {page, size}, new RowMapper(){ @Override public Object mapRow(ResultSetrs, introwNum) throws SQLException { Message message = new Message(); message.setId(rs.getInt("ID")); message.setName(rs.getString("NAME")); message.setContent(rs.getString("CONTENT")); } }); return list; } 결과값을 원하는 방식으로 가공하여 리턴 PrivatestaticfinalstringINSERT_SQL= “insertintoGUESTBOOK” + “(GUEST_NAME,CONTENT) values (?,?)”; Public void insert(Message message){ jdbcTemplate.update(INSERT_SQL, new Object[]{message.getGuestName(),message.getContent()}); } • List query(SQLquery(SELECT), arguments, Results) : Prepared statement • List query(SQLquery(SELECT), Results) : 정적 SQL • int update(SQL query(INSERT, UPDATE, DELETE), (arguments)) :Prepared SQL • intupdate(SQL query(INSERT, UPDATE, DELETE) : static SQL
3.2. NamedParameterJdbcTemplate클래스를 이용한 JDBC 프로그래밍 private static final String SELECT_SQL = "select * from GUESTBOOK desc limit :startRow, :size"; public List<Message> selectList(intpage,int size) { Map<String,Object> params = new HashMap<String, Object>(); params.put("startRow",startRow); params.put("size",size); List<message> list=jdbcTemplate.query(SELECT_SQL,params, new RowMapper(){ @Override public Object mapRow(ResultSetrs, introwNum) throws SQLException { Message message = new Message(); message.setId(rs.getInt("ID")); message.setName(rs.getString("NAME")); message.setContent(rs.getString("CONTENT")); } }); return list; } • 이름 기반의 파라미터 설정(MAP 형식)
3.3. SimpleJdbcTemplate클래스를 이용한 JDBC 프로그래밍 private static final String SELECT_SQL = "select * from GUESTBOOK desc limit ?,?"; public List<Message> selectList(intpage,int size) { List<message> list=jdbcTemplate.query(SELECT_SQL,newParameterizedRowMapper<Message>(){ @Override public Message mapRow(ResultSetrs, introwNum) throws SQLException { Message message = new Message(); message.setId(rs.getInt("ID")); message.setName(rs.getString("NAME")); message.setContent(rs.getString("CONTENT")); return message; } }, page, size); return list; } • 이름 기반의 파라미터 사용 : query(SQL, ParameterizedRowMapper<T>, Map args) • 가변 인수 사용 : query(SQL, ParameterizedRowMapper<T>, Object … args)
4. iBatis sqlMapClient dataSource configLocation sqlMapClient Template sqlMapClient-ref dataSource, iBATIS설정파일 명시 • Template : • 코드 중복을 없애고 • SQLException을 스프링이 제공하는 • 예외 클래스로 변환하고 • - iBATIS의 sqlMapClient와 거의 동일한 메소드 제공 messageDAO sqlMapClient Template-ref sqlMapConfig.xml <sqlMapConfig> 매핑 설정파일을 명시 Template을 이용해서 실제로 iBATIS사용 GuestBook.xml <sqlMap> 매핑할SQL 구문
4. iBatis <bean id="sqlMapClient” class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" p:dataSource-ref="dataSource” p:configLocation="WEB_INF/sqlMap/sqlMapConfig.xml"> </bean> <bean id="sqlMapClientTemplate” class="org.springframework.orm.ibatis.SqlMapClientTemplate” p:sqlMapClient-ref="sqlMapClient"> </bean> <bean id="messageDao” class="org.springframework.orm.ibatis.iBatisMessageDao” p:sqlMapClientTemplate-ref="sqlMapClientTemplate"> </bean> <!DOCTYPE sqlMapConfig PUBLIC "-//ibais.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig><sqlMap resource="GuestBook.xml" /></sqlMapConfig> <!DOCTYPE sqlMapConfig PUBLIC "-//ibais.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMap namespace="GuestBook" <select id="selectList" resultMap="messageResultMap" resultClass="Message" parameterClass="map"> select * from GUESTBOOK_MESSAGE order by GUESTBOOK_MESSAGE_ID desc limit #startRow#, #size# </select> </sqlMap>
4. Hibernate Session == connection dataSource, Hibernate설정파일 명시 sessionFactory dataSource mappingResource Hibernate Template sessionFactory-ref messageDAO hibernate Template-ref • Template : • 코드 중복(try-catch) 방지 • 스프링이 제공하는 예외에 맞게 변환 Message.hbm.xml Template을 이용해서 실제로 Hibernate 사용 매핑 정보를 담고 있는 설정파일
4. Hibernate <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean“ <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list><value>hibernate/Message.hbm.xml</value></list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> </props> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate” p:ssesionFactory-ref="ssesionFactory" /> <bean id="messsageDao" class="HibernateMessageDao” p:hibernateTemplate-ref="hibernateTemplate" />
4. Hibernate • Hibernate Session이 제공하는 메서드 (get(), load(), save() 등)를 동일하게 제공 • Hibernate Query를 생성하지 않고 사용할 수 있는 find() • List find(String queryString) • List findByNamedParam(String queryString, String[] paramNames, Object[] values) • Hibernate의 NamedQuery실행 메소드 • findByNamedQuery(String queryName) • Criteria 실행 메소드 • List findByCriteria(DetachedCriteria criteria)