chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발...

21
Chapter 06 데데데데데데 데데 데데 데데데 : 데데데 데데데 : 데데데데데데데 데데데데데 : 2009.08.26

Upload: gyles-manning

Post on 12-Jan-2016

235 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

Chapter 06

데이터베이스 연동 지원작성자 : 장은호

소속팀 : 네이버메인개발

작성년월일 : 2009.08.26

Page 2: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

목차

1. 스프링의 데이터베이스 연동 지원

2. DataSource 설정

3. 스프링의 JDBC 지원

4. iBATIS/ 하이버네이트 /JPA 연동 지원

Page 3: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

1. 스프링의 데이터베이스 연동 지원

Page 4: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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 을 발생시킴

Page 5: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

2. DataSource 설정

Page 6: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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) 이용

Page 7: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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 에 등록된 객체명 명시

Page 8: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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” />

Page 9: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

2.4. DataSource 로부터 Connection 구하기

public class JdbcMessageDao omplements MessageDao {

private DataSource dataSource;

public void setDataSource(DataSource dataSource) {

this.dataSource=dataSource;

}

@Override

public int selectCount() {

Connection conn=null;

try {

// conn=dataSource.getConnection();

conn=DataSourceUils.getConnection(dataSource);

} finally {

// JdbcUtils.closeConnection(conn);

datasourceutils.releaseConnection(conn,dataSource);

}

}

}

DataSource 로부터 Connection 구하기

getConnection() 활용하면 되나 스프링이 제공하는 트랜잭션 관리 기능 활용할 수 없음

이를 방지하기 위해 DataSourceUtils 클래스를 이용하여 connection 을 구하고 반환함 .

Page 10: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

3. 스프링의 JDBC 지원

Page 11: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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

dataSourcemessageDao

p:jdbcTemplate-ref

Page 12: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

3.1. JdbcTemplate 클래스를 이용한 JDBC 프로그래밍

Private static final string INSERT_SQL = “insert into GUESTBOOK” + “(GUEST_NAME,CONTENT) values (?,?)”;

Public void insert(Message message){

jdbcTemplate.update(INSERT_SQL, new Object[]{message.getGuestName(),message.getContent()});

}

private static final String SELECT_SQL = "select * from GUESTBOOK desc limit ?,?";

public List<Message> selectList(int page,int size) {

List<message> list=jdbcTemplate.query(SELECT_SQL,new Object[] {page, size}, new RowMapper(){

@Override

public Object mapRow(ResultSet rs, int rowNum) throws SQLException {

Message message = new Message();

message.setId(rs.getInt("ID"));

message.setName(rs.getString("NAME"));

message.setContent(rs.getString("CONTENT"));

}

});

return list;

}

List query(SQL query(SELECT), arguments, Results) : Prepared statement

List query(SQL query(SELECT), Results) : 정적 SQL

int update(SQL query(INSERT, UPDATE, DELETE), (arguments)) : Prepared SQL

int update(SQL query(INSERT, UPDATE, DELETE) : static SQL

결과값을 원하는 방식으로 가공하여 리턴

Page 13: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

3.2. NamedParameterJdbcTemplate 클래스를 이용한 JDBC 프로그래밍

private static final String SELECT_SQL = "select * from GUESTBOOK desc limit :startRow, :size";

public List<Message> selectList(int page,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(ResultSet rs, int rowNum) throws SQLException {

Message message = new Message();

message.setId(rs.getInt("ID"));

message.setName(rs.getString("NAME"));

message.setContent(rs.getString("CONTENT"));

}

});

return list;

}

이름 기반의 파라미터 설정 (MAP 형식 )

Page 14: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

3.3. SimpleJdbcTemplate 클래스를 이용한 JDBC 프로그래밍

private static final String SELECT_SQL = "select * from GUESTBOOK desc limit ?,?";

public List<Message> selectList(int page,int size) {

List<message> list=jdbcTemplate.query(SELECT_SQL,new ParameterizedRowMapper<Message>(){

@Override

public Message mapRow(ResultSet rs, int rowNum) 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)

Page 15: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

4. iBATIS/Hibernate/JPA 연동 지원

Page 16: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

sqlMapClient

dataSourceconfigLocation

sqlMapCon-fig.xml

<sqlMapConfig>

GuestBook.xml

<sqlMap>

sqlMapClientTemplate

sqlMapClient-ref

messageDAO

sqlMapClientTemplate-ref

dataSource, iBATIS 설정파일 명시

매핑 설정파일을 명시

매핑할 SQL 구문

Template : -코드 중복을 없애고-SQLException 을 스프링이 제공하는예외 클래스로 변환하고- iBATIS 의 sqlMapClient 와 거의 동일한 메소드 제공 Template 을

이용해서실제로 iBATIS 사용

4. iBatis

Page 17: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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>

Page 18: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

sessionFactory

dataSourcemappingRe-

source

Message.hb-m.xml

HibernateTemplate

sessionFactory-ref

messageDAO

hibernateTemplate-ref

Session == connectiondataSource,Hibernate 설정파일 명시

매핑 정보를 담고 있는 설정파일

Template : -코드 중복 (try-catch) 방지-스프링이 제공하는 예외에 맞게 변환 Template 을 이용해서

실제로 Hibernate 사용

4. Hibernate

Page 19: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

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" />

Page 20: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

4. Hibernate

Hibernate Session 이 제공하는 메서드 (get(), load(), save() 등 ) 를 동일하게 제공

Hibernate Query 를 생성하지 않고 사용할 수 있는 find()

List find(String queryString)

List findByNamedParam(String queryString, String[] paramNames, Object[] val-

ues)

Hibernate 의 NamedQuery 실행 메소드

findByNamedQuery(String queryName)

Criteria 실행 메소드

List findByCriteria(DetachedCriteria criteria)

Page 21: Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26

Thank you.