반응형
ibatis + JNDI를 이용한 DBCP 를 활용하여 Struct2 환경의 사용자 정의 트랜잭션을

처리하는 방법에 대해서 알아보자. 우선 준비물이 필요하다.

[1] 필요한 Library들을 다운받는다.

commons-dbcp-1.4.jar
commons-collections-3.2.1.jar
commons-pool-1.4.jar

위 3개가 필요하다. 다운로드는 jakarta 홈페이지 가면 다운가능하다. 최신버젼을 받는것이 좋다고 본다. ㅋ

[2] JNDI 설정 (Eclipse 기준)

[2-1] Tomcat 6.0 기준으로 Eclipse에서 보면 Server 라는 Project가 생성된 것
        을 확인 할 수 있다. 해당 파일에서 server.xml을 찾아서 해당 위치
        Resource를 가져다 
놓는다.


위 그림에서 server.xml을 열어 아래 코드를 추가한다.

<Context docBase="RUNA_FRAMEWORK" path="/RUNA_FRAMEWORK" reloadable="true" source="org.eclipse.jst.jee.server:RUNA_FRAMEWORK">
<Resource 
    name="jdbc/TestDB" ==> JNDI 이름
    username="rangi" ==> DB 접속 계정명
    password="rangi" ==> DB 접속 비밀번호
    url="jdbc:mysql://127.0.0.1:3306/mands" ==> 접속 URL
    driverClassName="com.mysql.jdbc.Driver" ==> 접속 DB Driver name
    type="javax.sql.DataSource"      ==> return Type을 DataSource로 한다.
    auth="Container" 
    maxActive="100" 
    maxIdle="30" 
    maxWait="10000"  
/>
</Context>

[2-2] 현재 생성된 Project의 web.xml 파일을 열어 Web Service 시작시 JNDI를
        참조 할 수 있도록 설정해준다.


위 그림에서 web.xml을 열어 아래 코드를 추가한다.

<resource-ref>
   <description>DB Connection</description>
   <res-ref-name>jdbc/TestDB</res-ref-name> => 요기에 JNDI 이름
   <res-type>javax.sql.DataSource</res-type> => return 되는 형태의 타입을 적어줌
   <res-auth>Container</res-auth>
</resource-ref>

이제 JNDI 설정은 끝났다. 의외로 별로 어렵지 않다.

[3] Java Source를 통해 JNDI를 호출해 보자.

ibatis에서 트랜잭션을 관리하기 위해 사용자 정의 트랜잭션 방식을 사용한다.
내용인즉 이렇다. ibatis는 트랜잭션을 관리를 해주지만, 별도 사용자가 트랜잭션을 관리하는
방식이 기존의 코딩하시는 분들도 편하고 biz단과 dao단을 분리 가능하기 때문이다.
아래 코드를 보자.

public class CommonBiz {
  // ibatis sqlMapper 객체 선언
  protected static SqlMapClient sqlMapper;

  // Connection 객체 선언
  protected static Connection conn = null;

  // ibatis Session 객체 선언
  protected static SqlMapSession session = null;

  static {
     try {
           // sqlMapConfig file 로부터 CONFIG파일을 Reader로 가져온다.
           Reader reader = Resources.getResourceAsReader(CommonConfig.getKey("sqlmap_config_path"));

          // Reader로 부터 읽어온 내역을 sqlMapper에 맵핑한다.
          sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);

          // JNDI로 부터 Context값을 얻어와 DataSource를 생성한다.
          Context envContext = (Context) new InitialContext();
          DataSource ds = (DataSource) envContext.lookup("java:/comp/env/jdbc/TestDB");
          conn = ds.getConnection();
          conn.setAutoCommit(true);
          System.out.println("Connection Success");

 
         // DataSource를 Session에 맵핑 하여 Connection을 전달한다.
         session = sqlMapper.openSession(conn);
         
         reader.close();
     } catch (IOException e) {
     } catch (NamingException e) {
     } catch (SQLException e) {

     }
   }
}

위 소스중에서 노란색으로 된 부분이 DataSource를 읽어오는 부분이며, 핑크색 으로 된부분
이 DataSource를 가져와 SqlMapper에 Mapping하는 부분이다.

[4] Ibatis 설정 파일을 셋팅한다.

[4-1] sqlMapper를 생성한다.

 <sqlMapConfig>
    <settings
        cacheModelsEnabled="true"
        enhancementEnabled="true"
        lazyLoadingEnabled="true"
        maxRequests="32"
        maxSessions="10"
        maxTransactions="5"
        useStatementNamespaces="false" 
    />

    <sqlMap resource="config/ibatis/test/test.xml" />
</sqlMapConfig>

내용은 머 별거 없다. 위 내용에 대해서는 언급하지 않겠다.

[4-2] test.xml 파일을 생성한다.

<sqlMap namespace="test">
    <select id="selectAllAccounts" resultClass="java.util.HashMap">
    SELECT * FROM score
    </select>
</sqlMap>

[5] Action 코딩을 한다. (요게 마지막)

try {
List<?> list = session.queryForList("selectAllAccounts");
for (int i = 0; i < list.size(); i++) {
HashMap data = (HashMap) list.get(i);
System.out.println(data.get("score"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
}


요렇게 하면 끝.ㅋㅋㅋㅋ

에고 장시간 글을 썼다. 엄청 힘드네~~ 30분이나 글을 썼다.

또 까먹을까봐 이렇게 기록해 둔다. 이제 앞으로 까먹지 말고 여기서 복사 만 해서 써야징...

헤헤헤헤헤헤

                                                                                - 2010.12.22 랑이씀 -
반응형

'Framework' 카테고리의 다른 글

[ ibatis SqlMapConfig Warning 제거 ]  (0) 2010.12.21

+ Recent posts