반응형

저번시간까지 MVC를 완성해보았는데요.

이번엔 외부라이브러리를 써서 Model을 좀 바꿔 보도록하겠습니다.

저번에 구성한 Model은 i-batis를 이용하여 재구성해보는 시간을 가지겠습니다.

i-batis는 아파치 소프트웨어 재단에서 개발하였으며 iBATIS(아이바티스)는 SQL에 기반한 데이터베이스와 자바닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 영속성 프레임워크(Persistence Framework)이다. 이러한 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동한다.
ORM(Object Relational Mapping)

지금은 구글로 넘어가서 My-batis라고 불립니다. 

JDBC와 i-batis의 차이점 비교해봅시다.

기존의 JDBC에서는 실제로 사용되는 DB드라이버 로드부터 커넥션 객체를 생성하고 실제 DB에 접근하여 

해당 결과 값을 받아옵니다.

현재 구현된 소스에서는 하나하나의 커넥션을 관리해주는 커넥션 풀을 사용하지 않고,

모든 사용자에게 커넥션을 허용하였기 때문에 사용자가 몰릴 경우 DB에 과도한 무리를 주어 성능 상의 문제를 야기할 수 있습니다. 

i-Batis는 이러한 커넥션 생성부터 관리까지의 일련의 db연결과정을 정형화시켜놓은 라이브러리입니다.

XML파일에 맵핑 정보와 쿼리를 적어두고 데이터베이스의 테이블과 자바 객체를 맵핑하여

코딩의 단순화와 jdbc를 사용할 때 불편했던 작업들을 대신 수행해주므로써

코드의 분량을 기존대비 60%정도만으로도 프로그램의 작성이 가능해 집니다.


i-batis의 사용을 위해 라이브러리를 추가합시다.

ibatis-dao-2.jar

ibatis-sqlmap-2.jar

ibatis-common-2.jar


저번과 똑같이 WebContent > WEB-INF > lib폴더에 넣어두면 됩니다.

이제 이 라이브러리를 사용하기 위해 src 폴더에 

new > package > com.board.db.sqlconfig 

를 생성해줍시다. 

위의 패키지안에 SqlMapConfig.xml파일을 생성합시다.

그리고 아래의 내용을 채워넣습니다.

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

    <properties resource="com/board/db/sqlconfig/SqlMapConfig.properties" />

    <!-- 접속정보를 저장한 properties파일을 지정합니다. -->

    <settings

        cacheModelsEnabled="true"

        enhancementEnabled="true"

        lazyLoadingEnabled="true"

        maxRequests="20"

        maxSessions="10"

        maxTransactions="10"

        useStatementNamespaces="false"

    />

    <transactionManager type="JDBC">

        <dataSource type="DBCP">

            <property name="JDBC.Driver" value="${driver}"/>

            <property name="JDBC.ConnectionURL" value="${url}"/>

            <property name="JDBC.Username" value="${username}"/>

            <property name="JDBC.Password" value="${password}"/>

            <property name="Pool.MaximumActiveConnections" value="10"/>

            <property name="Pool.MaximumIdleConnections" value="10"/>

            <property name="Pool.MaximumWait" value="60000"/>

            <property name="Pool.ValidationQuery" value="select 1 from dual"/>

            <property name="Pool.LogAbandoned" value="false"/>

            <property name="Pool.RemoveAbandoned" value="false"/>

            <property name="Pool.RemoveAbandonedTimeout" value="60000"/>

        </dataSource>

    </transactionManager> 

    <sqlMap resource="com/board/db/sqlmaps/Board.xml"/>

</sqlMapConfig>


간단히 설명해보자면 접속정보를 저장해둔 SqlMapConfig.properties에서 파일을 지정하고

<setting>에서 접속에 관련된 내용을 세팅합니다. 

그리고 맨아래에 sqlMap resource에 경로가 있는데 이 .xml파일이 DB에 접속할 SQL구문이 들어가게 됩니다.

Board.xml에 있는 내용은 추후에 채워넣기로 하고 지금까지 설정한 파일을 Java에서 사용하기 위해

IBatisDBConnector.java를 만듭시다.

com.board.db.sqlconfig에서 IBatisDBConnector.java파일을 만들어줍시다.

들어갈 내용은 아래와 같습니다.

package com.board.db.sqlconfig;

 

import java.io.Reader;

import com.ibatis.common.resources.Resources;

import com.ibatis.sqlmap.client.SqlMapClient;

import com.ibatis.sqlmap.client.SqlMapClientBuilder;

 

 

 

public final class IBatisDBConnector {

    private static SqlMapClient mySQLMap;

    static

    {

        try

        {   // 접속설정파일로드

            String resource = "com/board/db/sqlconfig/SqlMapConfig.xml";   

            Reader reader = Resources.getResourceAsReader(resource);

            mySQLMap = SqlMapClientBuilder.buildSqlMapClient(reader);

 

        }

        catch(Exception e)

        {

            e.printStackTrace();

        }      

    }

    public static SqlMapClient getSqlMapInstance()

    {   // 인스턴스 반환 메서드

        return mySQLMap;

    }

}

접속 설정파일 경로를 지정하고 읽을 준비를하고 인스턴스를 반환하는 메소드를 구현하였습니다.

아 그전에 DB연결을 위한 driver와 url, username, password파일이 필요한대요.

com.board.db.sqlconfig에서 SqlMapConfig.properties를 만들어 줍시다.

driver=core.log.jdbc.driver.OracleDriver

url=jdbc:oracle:thin:@localhost:1521:XE

username=root

password=root

위의 구문을 넣어주시는데 공백이나 필요없는 문자가 들어가면안됩니다.


보시면 IBatisDBConnector에서 연결을 위해 설정 값 파일인 SqlMapConfig.xml를 불러옵니다.

SqlMapConfig.xml에 properties resource에는 SqlMapConfig.properties라는 파일이 있는데, DB의 연결을 위해 driver,url,username,password가 적힌 파일을 읽어옵니다.

그리고 연결을 위한 settings값이 들어가고 property 설정이 들어갑니다. 마지막에 sqlMap resource에서는 DB에 들어갈 SQL Query문이 들어가게됩니다. 


이제 DB에 들어갈 SQL Query문이 있는 Board.xml을 채워봅시다. 

<typeAlias alias="str" type="java.lang.String" />

<typeAlias alias="int" type="java.lang.Integer" />

<typeAlias alias="board" type="com.board.beans.board" />


typeAlias는 긴 클래스명에 별칭을 주어 별칭만으로 접근 가능할 수 있도록 해줍니다.

기본타입의 String과 int 이외에도 사용자 지정 클래스(우리가 선언한 bean.board)도 별칭 지정이 가능합니다.


이제 Sql Query문이 들어갈 태그를 작성해보겠습니다.

쿼리 태그에서 대표적으로 쓰는 4가지 태그가 있습니다.

<select id="" parameterClass="" resultClass=""> </select>

<insert id=""  parameterClass ="" > </insert>

<delete id=""  parameterClass ="" > </delete>

<update id=""  parameterClass ="" > </update>

id는 Dao에서 해당 쿼리를 식별하기위한 변수(식별자)로 쓰입니다.

parameterClass는 쿼리를 실행할 때 파라미터가 필요할 경우, 이 속석값에 클래스 패스를 적어줍니다.

만약 int 값이라면 java.lang.Integer를 넣어주시면되는데 우리는 typeAlias에 선언을 했기때문에 int를 써도 무방합니다.

Board.xml 완성은 다음과 같습니다.


i-batis를 이용해서 DB 연결을 위한 세팅과 SQL 쿼리문까지 다 만들었습니다. 그렇다면 이제 이 것을 사용해야겠죠.

CommonDao.java로 가서 클래스 내의 내용을 다 지워줍시다. 어차피 여기서 하는 일은 i-batis로 다 넘겼기때문에

필요가 없지요.

i-Batis에서 제공하는 sqlMapClient객체를 생성하고 IBatisDBConnector로부터 인스턴스를 가져오는 SetDB메소드를 구현합니다.

IBatisDBConnector를 사용하기위해 import하고 myDB를 사용하기위해 sqlMapClient도 import합니다.


CommonDao.java까지 바꾸었습니다. 그럼 CommonDao를 쓰는 BoardDao.java도 바꾸어주어야합니다.

마찬가지로 BoardDao에 있던 내용들을 싹다 지워줍니다.

그리고 다음내용으로 바꿔줍니다.

package com.board.dao;


import com.board.beans.board;

import java.util.ArrayList;

import java.sql.SQLException;


public class BoardDao extends CommonDao{


public static BoardDao getInstance() {    // 기존에 구현했던 getInstance메서드

    BoardDao _instance = new BoardDao();

    _instance.SetDB();                // 이 코드 한줄이 추가되었습니다.

    return _instance;

 

}

@SuppressWarnings("unchecked")

public ArrayList<board> getArticleList() throws SQLException{

return (ArrayList<board>)GetDB().queryForList("getArticleList", null);

}

}


CommonDao를 extends하여  SetDB()으로 CommonDao에서 GetDB()를 통해 SqlMap 객체를 가져옵니다.

i-Batis를 통해 queryForList()라는 메소드로 IBatisDBConnector를 이용하여 Board.xml에 있는 getArticleList라는 식별자를

가진 SQL 쿼리문을 실행하게됩니다. 그 값을  ArrayList<board>형태로 값을 반환합니다.

두번째 변수인 null은 쿼리에 쓸 파라미터입니다. Object형태로 어떤 객체든 넘길 수 있다고 합니다.

여기서 queryForList()이외에 queryForObject등 다른 메소드가 있는데,

SELECT문에서 여러 개의 행을 가져오면 QueryForList() 메소드를 써야하고

하나의 행을 가져오면 QueryForOjbect() 메소드를 사용하면됩니다.

포스팅은 하지 않을거지만 개인적으로 수정,삭제를 추가하실때

update쿼리일 경우에 update

delete쿼리일 때 delete

insert쿼리일 때 insert메소드를 사용하여 쓰시면 됩니다.

이거말고도 많은 쿼리가 있다는데, 찾아보시면 될 듯싶습니다.

그리고!

commons-dbcp-1.2.2.jar

commons-pool-1.3.jar

log4sql.jar

이 파일들을 WebContent > WEB-INF > lib에 넣읍시다.

그리고 구동해서 잘나오면 됩니다.

아래에 SQL 쿼리문이 어떤게 실행되는지 확인할 수 있습니다.

** SqlMapConfig.properties에 driver값이 다를 수 있는데 log4sql.jar를 넣으면서 교체해주어야합니다.
*** 그냥 쭉 따라하시면 잘 될거에요(아마)


















































반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기