블로그 이미지

카테고리

분류 전체보기 (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

공지사항

태그목록

최근에 올라온 글

JDBC를 사용하여 Oracle 데이터를 Connection하는 doa, vo를 설계해 보자.

 

1. 테스트를 위한 간단한 게시판테이블을 생성해 보자.


CREATE TABLE TBL_BBS

(

             bbsno                NUMBER(15)  NOT NULL ,

             title                 VARCHAR2(200)  NULL ,

             writer                VARCHAR2(20)  NULL ,

             hits                  NUMBER(5)  NULL ,

             content               VARCHAR2(500)  NULL ,

             regdate               DATE  DEFAULT sysdate

);

 

2. Sequece도 생성해 줍니다.

CREATE SEQUENCE seq_bbsno;

 

3. 테스트 데이터를 입력합니다.

INSERT INTO tbl_bbs (bbsno, title, content, writer, hits)

VALUES(SEQ_BBSNO.NEXTVAL,'jdbc 테스트를 위한 Sample data 입니다.', 'sample data contents 입니다.','S0001',0);

 

데이터는 많을수록 좋죠 ^^; 몇건을 더 넣어 보겠습니다. ( 아래 쿼리를 실행시키면 금방 수만건의 데이터를 만들수 있겠죠 ^^)

INSERT INTO tbl_bbs (bbsno, title, content, writer, hits)(SELECT SEQ_BBSNO.NEXTVAL, title, content, writer, hits FROM TBL_BBS);

 

글내용이 동일하니 구분을 주기 위해서 시퀀스 번호를 타이틀과 내용에 추가해 보겠습니다.

UPDATE TBL_BBS SET TITLE = TITLE || '(' || BBSNO || ')',CONTENT = CONTENT || '(' || BBSNO || ')'

 

조회해 보면 아래와 같은 데이터가 생성된 되겠죠 ^^;

 

자 우선 VO(Value Object)를 만들어야 겠죠?

package org.power.vo;

 

import java.util.Date;

public class BbsVO {

            

             private int bbsno;

             private String title;

             private String writer;

             private int hits;

             private String content;

             private Date regdate;

            

             public int getBbsno() {

                           return bbsno;

             }

             public void setBbsno(int bbsno) {

                           this.bbsno = bbsno;

             }

             public String getTitle() {

                           return title;

             }

             public void setTitle(String title) {

                           this.title = title;

             }

             public String getWriter() {

                           return writer;

             }

             public void setWriter(String writer) {

                           this.writer = writer;

             }

             public int getHits() {

                           return hits;

             }

             public void setHits(int hits) {

                           this.hits = hits;

             }

             public String getContent() {

                           return content;

             }

             public void setContent(String content) {

                           this.content = content;

             }

             public Date getRegdate() {

                           return regdate;

             }

             public void setRegdate(Date regdate) {

                           this.regdate = regdate;

             }

}

 

 

Interface를 설계합니다.

package org.power.dao;

 

import org.power.vo.BbsVO;

 

public interface BbsDAO {

            

             public void insert(BbsVO vo) throws Exception;

             public void select(int bbsno) throws Exception;

             public void update(BbsVO vo) throws Exception;

             public void delete(int bbsno) throws Exception;

            

}

 

AbstractDAO를 설계합니다바로 BbsVO Implements해도 되지만 JDBC에서 connection, closing과 같은 일련의 작업을 Abstract 클래에서 처리함으로써 프로그램을 단순화하고 재사용성과 안정성을 높입니다.

package org.power.dao;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

 

public abstract class AbstractDAO{

 

             Connection con;

             PreparedStatement pstmt;

             ResultSet rs;

            

             public final void execute() {

                          

                           try {

                                        init();

                                        query();

                                        close();

                           catch (Exception ex) {

                                        ex.printStackTrace();

                           }

             }

            

             private void init() throws Exception {

                           Class.forName("oracle.jdbc.driver.OracleDriver");

                           con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL""tony""1234");

 

             }

             public abstract void query() throws Exception;

             private void close() {

 

                           if(rs != null)try {rs.close();} catch (Exception e) {}

                           if(pstmt != null)try {rs.close();} catch (Exception e) {}

                           if(con != null)try {rs.close();} catch (Exception e) {}

             }

}

 

BbsDAOImpl의 최종결과는 아래와 같습니다위의 AbstractDAO와 같은 패턴으로 설계를 한 경우 개발자는 단순히 아래와 같이 Query부분만 신경쓰면 되므로 생산성과 프로그램의 안정성이 더욱 좋아 질 것입니다.

package org.power.dao;

 

import org.power.vo.BbsVO;

 

public class BbsDAOImpl implements BbsDAO {

            

             final StringBuffer sql = new StringBuffer();

             final BbsVO bbsvo = new BbsVO();

            

             public void insert(final BbsVO vo) throws Exception {

                          

                           sql.append(" INSERT INTO TBL_BBS ");

                           sql.append(" (bbsno, title, content, writer, hits) ");

                           sql.append(" VALUES (?, ?, ?, ?, ?)");

                          

                           new AbstractDAO() {

                                       

                                        public void query() throws Exception {

                                                    

                                                     pstmt = con.prepareStatement(sql.toString());

                                                     pstmt.setInt(1, vo.getBbsno());

                                                     pstmt.setString(2, vo.getTitle());

                                                     pstmt.setString(3, vo.getContent());

                                                     pstmt.setString(4, vo.getWriter());

                                                     pstmt.setInt(5, vo.getHits());

                                                     pstmt.executeQuery();

                                                    

                                        }

                           }.execute();

             }

 

             @Override

             public BbsVO select(final int bbsno) throws Exception {

                          

                           sql.append(" SELECT ");

                           sql.append(" bbsno, title, content, writer, hits, regdate ");

                           sql.append(" FROM TBL_BBS WHERE bbsno = ? ");

                          

                           new AbstractDAO() {

                                       

                                        public void query() throws Exception {

                                                    

                                                     pstmt = con.prepareStatement(sql.toString());

                                                     pstmt.setInt(1, bbsno);

                                                     rs = pstmt.executeQuery();

                                                    

                                                     while(rs.next()) {

                                                                 

                                                                  bbsvo.setBbsno(rs.getInt(1));

                                                                  bbsvo.setTitle(rs.getString(2));

                                                                  bbsvo.setContent(rs.getString(3));

                                                                  bbsvo.setWriter(rs.getString(4));

                                                                  bbsvo.setHits(rs.getInt(5));

                                                                  bbsvo.setRegdate(rs.getDate(6));

                                                                 

                                                     }                                                                

                                        }

                           }.execute();

                          

                           return bbsvo;

             }

 

             @Override

             public void update(final BbsVO vo) throws Exception {

                          

                           sql.append(" UPDATE TBL_BBS SET ");

                           sql.append(" title=?, content=?, writer=?, hits=? ");

                           sql.append(" WHERE bbsno=? ");

                          

                           new AbstractDAO() {

                                       

                                        public void query() throws Exception {

                                                    

                                                     pstmt = con.prepareStatement(sql.toString());

                                                     pstmt.setString(1, vo.getTitle());

                                                     pstmt.setString(2, vo.getContent());

                                                     pstmt.setString(3, vo.getWriter());

                                                     pstmt.setInt(4, vo.getHits());

                                                     pstmt.setInt(5, vo.getBbsno());

 

                                                     pstmt.executeQuery();

                                                                                                                      

                                        }

                           }.execute();

 

             }

 

             @Override

             public void delete(final int bbsno) throws Exception {

 

                           sql.append(" DELETE FROM TBL_BBS ");

                           sql.append(" WHERE bbsno=? ");

                          

                           new AbstractDAO() {

                                       

                                        public void query() throws Exception {

                                                    

                                                     pstmt = con.prepareStatement(sql.toString());

                                                     pstmt.setInt(1, bbsno);

                                                     pstmt.executeQuery();

                                                                                                                      

                                        }

                           }.execute();                      

             }

}

 

 

위와 같이 한다 하더라도 많은 노가다성 코드가 존재하네요..;;; 나중에 ibatis라를 library를 사용하여 이런 부분을 해결하는 방안을 모색해 보겠습니다우선은 JDBC를 기준으로 작성을 해보겠습니다.

 

그럼 VO, DAO 설계를 마쳤습니다그럼 정상적으로 작동하는지 테스트를 해보겠습니다테스트는 Junit 툴을 사용하여 테스트를 해보겠습니다여기서는 Junit3.0을 기준으로 해보겠습니다.

  

Junit3.0 라이브러리가 세팅되었습니다이제 테스트 코드를 작성합니다.

 

Junit 테스트 클래스를 만들 때 setup stub메소드 부분을 체크해 주세요. Junit에서 테스트를 할 때 초기값 설정을 본 메소드에서 합니다.

 

자 테스트코드를 만들어 보겠습니다.

 

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 testDAO 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("새로운 글을 등록합니다.(타이틀)");

                                        vo.setContent("새로운 글을 내용을합니다.");

                                        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(200);

 

                                        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(300);

 

                                        vo.setTitle("300번 글 타이틀 수정입니다.");

                                        vo.setContent("300번 글 내용 수정한 내용입니다");

                                        vo.setHits(0);

 

                                        bbsDao.update(vo);

 

                           catch (Exception e) {

                                        // TODO Auto-generated catch block

                                        e.printStackTrace();

                           }

 

             }

 

             public void testDelete() {

 

                           try {

 

                                        bbsDao.delete(150);

 

                           catch (Exception e) {

                                        // TODO Auto-generated catch block

                                        e.printStackTrace();

                           }

 

             }

 

}

 

 

테스트코드를 작성하였습니다해당 메소드를 드래그하여 선택하고 실행하여 정상작동 여부를 확인할 수 있습니다. 

 

자 이제 DAO가 정상적으로 테스트 되는 것을 확인하였습니다. 이후 과정은 DAO를 사용하는 즉, business로직을 구현하는 Service를 설계해야겠지요. 서비스를 설계하고 구현한 다음 Web에서 들어오는 요청을 받아들이는 Servlet Controller를 설계 해야 됩니다. 대부분 이 부분은 Spring, Struts 등의 Servlet 프레임워크가 대체하고 있지요.

기본 적으로 웹을 작성할 때는 이와 같은 과정을 거치는 것 같습니다. VO, DAO, SERVICE까지를 Model라고 보고 Servlet Controller부분을 Controller로 봅니다. 그리고 JSP 또는 웹화면을 그리는 부분이 View단이라고 보면 됩니다.

이러면 MVC모델이 완성되는 군요. 우선은 JDBC를 사용하여 VO, DAO 설계 패턴을 만들어 보는데 목적이 있었으므로 목표는 완성했습니다.

그러나 위의 JDBC를 사용하여 하다 보니 애로사항이 발생합니다. 즉 각 DAO메소드를 구현할 때 엄청난 양의 코딩을 하게 되는군요. 생산성이 너무 떨어지게 되겠죠?? 다음에는 이를 해결하기 위해 ibatis를 활하여 만들어 보겠습니다.


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

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

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

최근에 달린 댓글

최근에 받은 트랙백

글 보관함