블로그 이미지

카테고리

분류 전체보기 (11)
Programming (6)
Baskek Ball (0)
Diary (2)
etc (1)
Picture (2)
Total
Today
Yesterday
02-16 01:41

달력

« » 2025.2
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

공지사항

태그목록

최근에 올라온 글

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 정상적으로 작동합니다.

 

이제 완성하였습니다자 그러면 새로운 테이블이 생성되고 똑 같은 기능의 게시판을 만든다고 했을 때는 새로운 인터페이스만 선언하고 xml파일만 만들어주면 새로운 게시판이 생성될 것입니다.


[출처] http://blog.naver.com/byebird


 

'Programming > Java' 카테고리의 다른 글

Ibatis 라이브러리를 이용한 VO,DAO의 구현  (0) 2011.07.19
JDBC를 이용한 VO,DAO의 구현  (0) 2011.07.19
Posted by 그리브스
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함