Generic을 사용한 VO, DAO의 구현
Generic이란 무엇일까요? Java 1.5 버전부터 나온 새로운 문법입니다. 음. 미결정된 선언을 컴파일 타임으로 미루므로써
프로그래밍의 유연성을 부여할 수 있게 되었습니다. 말이 좀 이상한데 한번 보면 될듯합니다.
일반적으로 insert, select, update, delete는 기본적으로 작성해야 되므로 이를 Abstract로 뽑아내어 공통으로 사용하고
필요한 것들만 만들어 사용하면 프로그램의 생산성이 향상되겠죠? 근데 이때 문제가 여러 개의 vo는 서로 다른 형태를
취하고 있으므로 이를 공통을 맞춰줄 수가 없게 됩니다. 이때 Generic을 사용하여 문제를 해결할 수 있습니다. Generic은
class파일을 생성하는 compile타임에 실제 선언된 타입으로 컴파일 됩니다.
package org.power.dao; public interface GenericDAO<V, K> { public void insert(V vo) throws Exception; public V select(K key) throws Exception; public void update(V vo) throws Exception; public void delete(K key) throws Exception; } |
공통으로 사용되는 코드를 Generic을 사용하여 Abstract로 구현해 보았습니다.
package org.power.dao; import java.io.IOException; import java.io.Reader; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class AbstractDAO<V, K> implements GenericDAO<V, K>{ protected static SqlMapClient sqlMap; protected String namespace; static { try { Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close(); } catch (IOException e) { // Fail fast. throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e); } } @Override public void insert(V vo) throws Exception { sqlMap.insert(namespace + ".insertBBS", vo); } @Override public V select(K key) throws Exception { return (V) sqlMap.queryForObject(namespace + ".selectBBS", key); } @Override public void update(V vo) throws Exception { sqlMap.update(namespace + ".updateBBS", vo); } @Override public void delete(K key) throws Exception { sqlMap.delete(namespace + ".deleteBBS", key); } } |
위에 namespace가 있습니다. 이는 서로 다른 성격의 insert, select, update, delete작업을 하는 xml의 분리하기 위해 사용됩니다.
그러므로 xml도 해당 namespace를 설정해 주어야 합니다.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <settings useStatementNamespaces="true"/> <transactionManager type="JDBC" commitRequired="false"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="JDBC.ConnectionURL"value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" /> <property name="JDBC.Username" value="tony" /> <property name="JDBC.Password" value="1234" /> </dataSource> </transactionManager> <sqlMap resource="BBS.xml" /> </sqlMapConfig> |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="BBS"> <insert id="insertBBS" parameterClass="org.power.vo.BbsVO"> <![CDATA[ INSERT INTO TBL_BBS (bbsno, title, content, writer, hits) VALUES (SEQ_BBS_NO.NEXTVAL, #title#, #content#, #writer#, #hits#) ]]> </insert> <select id="selectBBS" resultClass="org.power.vo.BbsVO"> <![CDATA[ SELECT bbsno, title, content, writer, hits, regdate FROM TBL_BBS WHERE bbsno = #bbsno# ]]> </select> <update id="updateBBS" parameterClass="org.power.vo.BbsVO"> <![CDATA[ UPDATE TBL_BBS SET title=#title#, content=#content#, writer=#writer#, hits=#hits#, regdate=#regdate# where bbsno=#bbsno# ]]> </update> <delete id="deleteBBS" parameterClass="java.lang.Integer"> <![CDATA[ DELETE FROM TBL_BBS WHERE bbsno=#bbsno# ]]> </delete> </sqlMap> |
BbsDAO를 만들어 보겠습니다. 즉 게시판 하나가 되겠지요. 아래에 보면 선언된 인터페이스가 하나도 없죠? 이는GenericDAO에서
선언되어 있으며 BbsDAO에서는 해당 코드를 물려 받습니다. 다만 여기서 중요한 것이 파라메터값이 확정된다는 것입니다.
package org.power.dao; import org.power.vo.BbsVO; public interface BbsDAO extends GenericDAO<BbsVO, Integer> { //만약 insert, select, update, delete 이외의 DAO메소드가 필요하다면 여기에 //인터페이스를 선언하고 Implements하면 됩니다. } |
구현 클래스를 보면 아래와 같습니다. 기본적으로 Abstract의 코드를 물려 받으므로 BbsDAO와 같이 BbsDAOImpl에도 별다른 코드가
없습니다. 다만 여기서 namespace를 결정해 주어야 합니다.
package org.power.dao; import org.power.vo.BbsVO; public class BbsDAOImpl extends AbstractDAO<BbsVO, Integer> implements BbsDAO { public BbsDAOImpl() { super(); namespace = "BBS"; } //BbsDAO에서 기본 insert, select, update, delete외에 DAO 메소드를 추가하였다면 //이부분에 구현을 해주시면 됩니다. } |
자 이제 DAO를 테스트 해보기로 하겠습니다. 테스트 코드는 기존과 동일합니다.
package org.power.test; import org.power.dao.BbsDAO; import org.power.dao.BbsDAOImpl; import org.power.vo.BbsVO; import junit.framework.TestCase; public class BbsDAOTest extends TestCase { private BbsDAO bbsDao; protected void setUp() throws Exception { super.setUp(); bbsDao = new BbsDAOImpl(); } public void testInsert() { BbsVO vo = new BbsVO(); try { vo.setTitle("Generic을 사용한 설계: 새로운 글을 등록합니다.(타이틀)"); vo.setContent("Generic을 사용한 설계: 새로운 글을 내용을합니다."); vo.setHits(100); vo.setWriter("S002"); bbsDao.insert(vo); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void testSelect() { BbsVO vo = new BbsVO(); try { vo = bbsDao.select(700); System.out.println(vo.getBbsno()); System.out.println(vo.getTitle()); System.out.println(vo.getContent()); System.out.println(vo.getWriter()); System.out.println(vo.getRegdate()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void testUpdate() { BbsVO vo = new BbsVO(); try { vo = bbsDao.select(600); vo.setTitle("800번 글 타이틀 수정입니다."); vo.setContent("800번 글 내용 수정한 내용입니다"); vo.setHits(0); bbsDao.update(vo); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void testDelete() { try { bbsDao.delete(1000); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Insert 정상적으로 작동함.
Select 정상적으로 작동합니다.
[출처] http://blog.naver.com/byebird
[출처] Generic을 사용한 VO, DAO의 구현|작성자 파랑물고기
'Programming > Java' 카테고리의 다른 글
Ibatis 라이브러리를 이용한 VO,DAO의 구현 (0) | 2011.07.19 |
---|---|
JDBC를 이용한 VO,DAO의 구현 (0) | 2011.07.19 |