티스토리 툴바


iBatis 삽질의 추억

프로그래밍/자바 2011/05/27 21:14 Posted by 팬소년

  

아. iBatis.

오늘 transaction을 명시적으로 적용한 (SqlMapClient.startTransaction() ) 함수를 하나 맹글었는데, 사실 그동안 iBatis에서 transaction을 쓸 일이 별로 없었다규.

이거이 쓰고 나면 딱 커넥션풀 갯수만큼만 잘 되고 그 다음부터는 커넥션풀을 얻어오지 못했다는 타임아웃 에러가 나고 먹통이 되어버린다.

밥먹고 와서 삽질한 결과, 드뎌 알아냈다. iBatis에서 startTransaction을 했거든 commitTransaction만 하지 말고 꼭 endTransaction도 하라는 것.

이런 형태면 된다.

 

try

{

SqlMapClient.startTransaction();

 

.....

 

SqlMapClient.commitTransaction();

}

catch (SQLException ex)

{

.....

}

finally

{

SqlMapClient.endTransaction();

}

 

이거였다. commitTransaction() 만 하면 Connection pool에 반납하지 않고 그냥 죽어버린다. 디져쓰.

꼭 endTransaction()도 해 주자.






  
자바에서는 이렇게 한다.

        ArrayList<String> arCapacity = new ArrayList<String>();
       
        String[] arResult = strCapacity.trim().split(",");
       
        // 검색어를 목록에 담는다.
        for (int i = 0; i < arResult.length; i++)       
            arCapacity.add(arResult[i]);
       
        List<MemberCapacityItemVO> list;
       
        try
        {           
            list = m_client.queryForList("searchMemberCapacity", arCapacity);
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
            return "";
        }

이걸 iBatis XML에서는
<select id="search" parameterClass="java.util.List" resultClass="ItemVO">
        select
            member.EMP_NO
        from
            member
        where
            and member.CODE in
            <iterate open="(" conjunction="," close=")">
                #arCapacity[]#
            </iterate>
    </select>

이걸로 끝이다. 와 실로 놀랍지 않은가.





  

<dependency>
     <groupId>org.apache.ibatis</groupId>
     <artifactId>ibatis-sqlmap</artifactId>
     <version>2.3.4.726</version>
</dependency>


역시 maven!




TAG maven

  

소스 디렉토리의 위치를 조정하니 maven에서 compile할 파일이 없다는 메시지가 나왔다. 아놔.

혹시 struts처럼 기본값이 있나 해서 알아봤더니 역시나였다.
굳이 소스 디렉토리의 default 값을 적지는 않겠다. 대부분 그걸 쓰고 있을테니.

pom.xml에서 아래의 부분을 수정해 줘야 한다.

<build>
        <finalName>${artifactId}-${version}</finalName>
       
        <!-- 내가 디렉토리 바꾸면서 같이 수정해 줘야 하는 부분들 -->
        <sourceDirectory>src</sourceDirectory>
        <scriptSourceDirectory></scriptSourceDirectory>
        <testSourceDirectory></testSourceDirectory>
       
        <resources>
    <resource>
     <directory>src/main/resources</directory>
    </resource>
   </resources>
   
   <testResources>
    <testResource>
     <directory></directory>
    </testResource>
   </testResources>
   <!-- 끝. 내가 디렉토리 바꾸면서 같이 수정해 줘야 하는 부분들 -->






  
허걱. maven2에서 

[INFO] Compilation failure
Failure executing javac, but could not parse the error:
An exception has occurred in the compiler (1.5.0_19). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport)  after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report.  Thank you.
java.nio.BufferOverflowException
        at java.nio.Buffer.nextPutIndex(Buffer.java:419)

이런 에러가 났다. 소스코드를 전부 utf-8로 바꾼 이후 발생한 문제다.

같은 코드를 javac로 바로 빌드해 봤더니 

[panboy@localhost sei]$ javac CDPMain.java
CDPMain.java:14: warning: unmappable character for encoding EUC_KR
// ??닿?? 留???? ??⑦?ㅼ????? 媛???몄?ㅺ린
   ^

이렇게 나온다. javac는 javac로 컴파일할 때 

[panboy@localhost sei]$ javac -encoding utf-8 CDPMain.java

이렇게 해주면 되지만, 나는 지금 maven2를 사용중이기 때문에 maven2에서 환경설정을 해줘야 한다.

각 프로젝트마다 pom.xml 파일을 수정해 준다.
다음과 같이 compiler plugin 부분을 수정해 주면 된다.

<plugins>
            <!-- Java Compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>                    
         <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

이제 잘 된다. ㅋ