참조

http://miconblog.com/tc/sohn/563

http://blog.naver.com/PostView.nhn?blogId=kobell9&logNo=90149920026


1. Spring 설정

web.xml 에 아래와 같이 Spring 에서 제공하는 filter를 설정해준다.

(POST를 한글처리를위한 설정)

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

servelt-context.xml 설정

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/views/" />

<beans:property name="suffix" value=".jsp" />

<beans:property name="contentType" value="text/html; charset=UTF-8" />

</beans:bean>


2. Server 설정

Server.xml

(GET 한글 처리를 위한 설정)


<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>


<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"URIEncoding="UTF-8"/>


3. jsp 설정

<%@ page session="false" pageEncoding="UTF-8"%>



4. Mybatis 입력시 한글깨짐
한글입력시깨짐문제 발생
jdbc.url=jdbc:mysql://localhost:3306/디비명?useUnicode=true&characterEncoding=utf8


5. @ResponseBody 응답시 한글깨짐
@RequestMapping(value = "/Act",produces="text/plain;charset=UTF-8")
@ResponseBody


6Eclipse설정

preference->general->workspace UTF-8 Setting

preference->web->CSS UTF-8 Setting

preference->web->HTML UTF-8 Setting

preference->web->JSP UTF-8 Setting



7. JavaScript 설정

GET으로 보낼때 encodeURI() 수행



출처 : 

http://egloos.zum.com/jth8172/v/11176221

<<< INSERT OR UPDATE >>>

- java
byte[] sumByte;
Map<String, Object> map = new HashMap<String, Object>();
map.put("sumByte", sumByte);

- mybatis xml
<update id="setBinaryFileInfo" parameterType="hashMap">
 UPDATE ICOMATCH SET BINARY_FILE_INFO = #{sumByte, typeHandler=org.apache.ibatis.type.ByteArrayTypeHandler}
</update>

 

<<< SELECT >>>

# xml
  <resultMap id="result"  type="hashMap">
    <result column="BINARY_FILE_INFO" property="BINARY_FILE_INFO" jdbcType="BLOB" javaType="[B" ></result>
  </resultMap>

 <select id="getBinaryFileInfo" parameterType="hashmap" resultMap="result">
     SELECT BINARY_FILE_INFO
     FROM ICOMATCH
       WHERE HOUSE_CODE = #{ses.houseCode}
           AND UUID = #{UUID}
           AND UUID_SEQ = #{UUID_SEQ}
 </select>

 

# mapper
 public Map<String, Object> getBinaryFileInfo(Map<String, Object> map);

 

# service
 public Map<String, Object> getBinaryFileInfo(String uuid, String uuid_seq){
  Map<String, Object> map = new HashMap<String, Object>();
  map.put("UUID", uuid);
  map.put("UUID_SEQ", uuid_seq);
  return fileAttachMapper.getBinaryFileInfo(map);
 }

# controller

  ServletOutputStream op = HttpServletResponse.getOutputStream();

  byte[] bbuf = new byte[4096];
  DataInputStream in = null;
  if("BID".equals(fileInfo.get("BIZ_TYPE"))){
   Map<String, Object> returnData = fileAttachService.getBinaryFileInfo(uuid, uuid_seq);
   ByteArrayInputStream bis = new ByteArrayInputStream((byte[])returnData.get("BINARY_FILE_INFO"));
      in = new DataInputStream(bis);
  }else{
   in = new DataInputStream(new FileInputStream(file));
  }
  while ((length = in.read(bbuf)) != -1) {
   op.write(bbuf, 0, length);
  }
  in.close();
  op.flush();
  op.close();

 

 

문제:
iBatis 에 parameterClass 로 List 를 넘긴 후,
iterate 태그 사용을 시도하였을 경우 아래와 같은 예외가 발생한다.

Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException


이 때 사용된 iBatis 구문은 아래와 같다.

<select id="selectSomething" parameterClass="list">
// select something and use iterate
<iterate property="someList">
#someList[]#
</iterate>
</select>


잘못된 게 없는 것 같은데, 왜 이럴까.


해결책:
정확한 원인은 모르겠으나, 일단 패러미터를 Map 형태로 전달해주면 문제 없이 작동한다.

queryForList 등의 메서드를 호출하기 전,
패러미터로 전달할 list 객체를 Map 객체로 감싼 후 전달하도록 한다.

<select id="selectSomething" parameterClass="map">
// select something and use iterate
<iterate property="someList">
#someList[]#
</iterate>
</select>


BUT, 아래 더 올바른 해결 방법이 있다.
=================================================================
# 추가. 2010.02.11

list 를 패러미터로 전달 시 iterate 태그에서 property 를 설정하면,
전달된 list 에서 해당 property 를 찾으려고 시도하는 것 같다.
<iterate> 태그에서 property 속성을 제거하면 정상적으로 작동한다.

<select id="selectSomething" parameterClass="list">
// select something and use iterate
<iterate> // iterate 태그 내 property 속성을 제거하라
#someList[]#
</iterate>
</select>


참고: iBatis: Support for Array or List Parameter with SQL IN Keyword
- ibatis부터 있던 고질적 버그
1. ${test}  <-- parameterType을 String으로 주고 java단에서 파라미터를 String으로 넘겨 줄 경우 에러 발생함.
2. #{test}는 잘됨.
3. int, map, VO등은 또 잘됨.. String만 안됨..
4. mybatis로 넘어왔는데도.. 고쳐지지 않았음.. String이 원래 그렇게 쓰면 안되는 거면.. int는 왜되냥!!

- mybatis 버그
1. map 형식으로 값을 String형식으로 1자리값(A)을 넣어서 보냄..
2. 다이나믹 쿼리에서 test="tttt = 'A'" 식으로 처리함.
3. 처리가 안됨... A를 NumberFormat 으로 변환할수 없다는 Exception만 발생함.
4. String인데 강제로 char나 Integer형으로 파싱하려한다고 생각함.
5. 다이나믹 쿼리에서 test="ttt = 'A' + ''" 식으로 처리함. 잘됨.
6. test="" 표현식 안에 들어갈수 있는 ognl 표현식을 보고 +'' 방식을 찾아냄.. 아래는 표현식 전부
    "," ...
    "=" ...
    "?" ...
    "||" ...
    "or" ...
    "&&" ...
    "and" ...
    "|" ...
    "bor" ...
    "^" ...
    "xor" ...
    "&" ...
    "band" ...
    "==" ...
    "eq" ...
    "!=" ...
    "neq" ...
    "<" ...
    "lt" ...
    ">" ...
    "gt" ...
    "<=" ...
    "lte" ...
    ">=" ...
    "gte" ...
    "in" ...
    "not" ...
    "<<" ...
    "shl" ...
    ">>" ...
    "shr" ...
    ">>>" ...
    "ushr" ...
    "+" ...
    "-" ...
    "*" ...
    "/" ...
    "%" ...
    "instanceof" ...
    "." ...
    "(" ...
    "[" ... <-- [] 는 배열이나 하위 속성의 값을 불러올때 쓰이는듯.. ['t']


마지막으로..
mybatis!! ibatis!! clob, blob 불러오려면 꼭 상단에 resultMap 정의해야 되는데.. 귀찮다.. 걍 가져올수 잇게 해주렴!
저장할땐 #{test:CLOB} 이렇게 걍 하면 되니까..
불러올때도 parameterType=hashmap 줬으면.. 옆에 따로 더 줘서 clob나 blob는 바로 string으로 변환될수 있는 옵션 추가해줬으면 좋으련만...


출처 : http://seongsland.tistory.com/entry/mybatis-%EB%B2%84%EA%B7%B8-ognl

1. Collection 객체를 사용하거나, String[] 배열로 넘기는 방법
 - 이 방법은 검색하면 많이 나와요 ^^

2. ArrayList객체안에  Map객체로 여러 속성사용

- Java Coding
  public void test() throws Exception {
       Map<String, List<HashMap<String,String>>> map = new HashMap<String,    List<HashMap<String,String>>>();
  List<HashMap<String,String>> paramList = new ArrayList<HashMap<String,String>>();
  
  for (int idx = 0; idx < 5; idx++) {
   HashMap<String,String> hashmap = new HashMap<String,String>();
   hashmap.put("a", "a"+ idx);
   hashmap.put("b", "b"+ idx);
   hashmap.put("c", "c"+ idx);
   paramList.add(hashmap);
  }
  map.put("condition", paramList);
  list("manage.test",map);
 }

- Sql Coding
 <select id="manage.test" parameterClass="map" resultClass="egovMap" remapResults="true">
  <iterate property="condition"  conjunction="union">
   select $condition[].a$, $condition[].b$, $condition[].c$ from dual
  </iterate>
 </select>

3. VO를 이용한 코딩

- VO
public class TestVO {
 String a = "";
 String b = "";
 String c = "";
 public String getA() {
  return a;
 }
 public void setA(String a) {
  this.a = a;
 }
 public String getB() {
  return b;
 }
 public void setB(String b) {
  this.b = b;
 }
 public String getC() {
  return c;
 }
 public void setC(String c) {
  this.c = c;
 }

- Java Coding
 public void test() throws Exception {
  ArrayList<TestVO> param = new ArrayList<TestVO>();
  
  for (int idx = 0; idx < 5; idx++) {
   TestVO vo= new TestVO();
   vo.setA("a"+ idx);
   vo.setB("b"+ idx);
   vo.setC("c"+ idx);
   param .add(map);
  }
  list("test",param );
 }

- Sql Coding
 <select id="test" parameterClass="list" resultClass="testVO">
  <iterate conjunction="union">
   select #[].a#, #[].b#, #[].c# from dual
  </iterate>
 </select>

<insert id="insert" parameterClass="customer">
  <selectKey resultClass="int" keyProperty="id">
    select someSequence.NEXTVAL as "id" from dual
  </selectKey>
  insert into Customer (id, name)
  values (#id#, #name#)
</insert>

<insert id="insert2" parameterClass="Entity" parameterMap="insert-paramMap">
   <selectKey resultClass="int" keyProperty="pkey"> SELECT seq.nextval FROM DUAL </selectKey>
   INSERT INTO EntityTable (PKEY, DATA) VALUES (?, ?)
</insert>

출처 : http://deadlock.tistory.com/172

출처 : http://www.jakartaproject.com/article/jsptip/119336284359281


iBatis 에서 SQL 로깅시 이뿌게 보이기


iBatis에서 SQL로깅은 한줄로 표현되기 때문에 디버깅이 불편합니다
이를 해결하고자 몇가지 알아봤지만 소스를 직접 수정하는수 밖에 없더군요

I. 소스받기

  • http://www.ibatis.com


II. 소스 수정 리스트

  • com.ibatis.common.jdbc.logging.ConnectionLogProxy.java
  • com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.java
  • com.ibatis.common.jdbc.logging.StatementLogProxy.java
  • com.ibatis.sqlmap.engine.mapping.sql.SqlText.java
  • com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql.java


1. com.ibatis.common.jdbc.logging.ConnectionLogProxy.java

//log.debug("{conn-" + id + "} Preparing Statement: " + removeBreakingWhitespace((String) params[0]));
log.debug("{conn-" + id + "} Preparing Statement: " + ((String) params[0]));
...
//log.debug("{conn-" + id + "} Preparing Call: " + removeBreakingWhitespace((String) params[0]));
log.debug("{conn-" + id + "} Preparing Call: " + ((String) params[0]));

주석처리 후 removeBreakingWhitespace 함수를 제거합니다
removeBreakingWhitespace 함수가 '\n'를 ' '로 replace 시킵니다

2. com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.java

//log.debug("{pstm-" + id + "} Executing Statement: " + removeBreakingWhitespace(sql));
log.debug("{pstm-" + id + "} Executing Statement: " + (sql));

마찬가지로 removeBreakingWhitespace 함수를 제거합니다

3. com.ibatis.common.jdbc.logging.StatementLogProxy.java

//log.debug("{stmt-" + id + "} Statement: " + removeBreakingWhitespace((String) params[0]));
log.debug("{stmt-" + id + "} Stmt Statement: " + ((String) params[0]));

역시나 removeBreakingWhitespace 함수를 제거합니다

4. com.ibatis.sqlmap.engine.mapping.sql.SqlText.java

public void setText(String text) {
    //this.text = text.replace('\r', ' ').replace('\n', ' ');
    this.text = text;
    this.isWhiteSpace = text.trim().length() == 0;
}

replace 하는 부분을 주석처리해 놓고 this.text = text; 를 추가합니다

5. com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql.java

public StaticSql(String sqlStatement) {
    //this.sqlStatement = sqlStatement.replace('\r', ' ').replace('\n', ' ');
    this.sqlStatement = sqlStatement;
}

마찬가지로 replace 하는 부분을 주석처리 하고 this.sqlStatement = sqlStatement; 를 추가시킵니다

III. 수동으로 컴파일 후 jar 압축하기
1. 다운받은 ibatis-2.3.0.677 를 압축을 풉니다
2. C:\ibatis-2.3.0.677\src\ibatis-src.zip의 압축을 풉니다
3. C:\ibatis-2.3.0.677\src\ 이하 위의 리스트에 있는 소스를 수정합니다
4. C:\ibatis-2.3.0.677\src\의 수정된 5개의 자바 소스를 C:\ibatis-2.3.0.677\lib\로 카피 합니다
5. C:\ibatis-2.3.0.677\lib\ibatis-2.3.0.677.jar 압축을 풉니다
6. C:\ibatis-2.3.0.677\lib\의 현재 상태입니다



7. cmd 창을 열어 C:\ibatis-2.3.0.677\ 이동 후 컴파일 합니다
javac -classpath "." -d ./ *.java

8. jar 압축 합니다
jar cvf ibatis-2.3.0.677.jar ./

ibatis.jar를 생성후 적용해 보면 한줄로 쭉 나오던 SQL이 아래와 같이 깔끕하게 나옵니다

2007-10-26 10:34:17,328 DEBUG [http-80-Processor24] sql.Connection    (JakartaCommonsLoggingImpl.java:27)     - {conn-100009} Preparing Statement:
                SELECT
                         COMMON_GB
                        ,COMMON_GB_NM
                        ,USE_YN
                        ,REGISTER_USER
                        ,LAST_UPDATE_USER
                        ,REGISTER_DT
                        ,LAST_UPDATE_DT
                FROM CMR_COMMONCD_MAST
                ORDER BY COMMON_GB


재생성한 jar파일 첨부합니다

com.ibatis.common.jdbc.logging.*  패키지에 JDBC관련 로깅 java들이 있습니다
ResultSet 로깅등 여러가지 부분들을 수정 할 수 있습니다


log4j는

 log4j-1.2.9.jar 파일을 lib에 임포트하고

classes 폴더아래 log4j.properties 또는 log4j.xml 파일을 설정해 주면 된다.

 

===========================================================

<<log4j.xml>> => 방법1 및 ibatis 쿼리로그보기 설정

===========================================================

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <!-- 콘솔로 보기(디버그) -->
    <appender name="CONSOLE-debug" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p - %C{1}  :  %M  %m %n"/>
        </layout>
    </appender>
   
    <!-- 콘솔로 보기(인포) -->
    <appender name="CONSOLE-info" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m ---%d %n"/>
        </layout>
    </appender>
   
    <!-- 콘솔로 보기(ibatis)
    <appender name="sql" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-5p %c{1} - %m%n" />
    </layout>
        <filter class="org.apache.log4j.varia.StringMatchFilter">
         <param name="StringToMatch" value="Result" />
            <param name="AcceptOnMatch" value="false" />
        </filter>
 </appender>
 -->
 
 <!-- 파일로 보기(ibatis) -->
    <appender name="sql" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="D:\\project\\maptest\\log\\ibatis.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-5p %c{1} - %m%n" />
    </layout>
    </appender>
 

 <category name="com.ibatis">
    <priority value="debug" />
  </category>
  <category name="java.sql">
    <priority value="debug" />
    <appender-ref ref="sql" />
  </category>
    
    <logger name="org.apache">
        <level value="WARN"/>
    </logger>
   
    <root>
        <level value="INFO"/>
        <appender-ref ref="CONSOLE-debug"/>
       
        <!--<appender-ref ref="LOGFILE-DAILY"/>-->
        <!--<appender-ref ref="LOGFILE-SIZE"/>-->
        <!--<appender-ref ref="CONSOLE-info"/>-->
        <!--<appender-ref ref="LOGFILE-XML"/>-->
    </root>
</log4j:configuration>
 

 

 

===========================================================

<<log4j.properties >> => 방법2

===========================================================

#root logger
log4j.rootLogger = INFO, stdout1,stdout2

#logger level ALL( all은 모든로그를 출력 )
log4j.logger.com.ex = ERROR
log4j.logger.org.apache.jsp = FATAL

#console appender (option 1 큰솔에 출력)
log4j.appender.stdout1 = org.apache.log4j.ConsoleAppender
log4j.appender.stdout1.layout = org.apache.log4j.SimpleLayout

#file appender(option 2 파일에 출력)
log4j.appender.stdout2 = org.apache.log4j.FileAppender
log4j.appender.stdout2.file = d:\\project\\maptest\\log\\weblog.log
log4j.appender.stdout2.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout2.layout.ConversionPattern = %d{HH:mm:ss} %t %M %m \n

 

===========================================================

테스트 하기(JUNIT 을 이용하여 테스트 하였다.)

===========================================================

import junit.framework.*;
import org.apache.log4j.Logger;
//import org.apache.log4j.BasicConfigurator;

public class TestCaseLog extends TestCase{
 
 static Logger logger = Logger.getLogger(TestCaseLog.class);
 
 public void testLog()
 {
  //BasicConfigurator.configure();

        logger.debug("[DEBUG] Hello log4j."); //no print
        logger.info ("[INFO]  Hello log4j."); //print
        logger.warn ("[WARN]  Hello log4j."); //print
        logger.error("[ERROR] Hello log4j."); //print
        logger.fatal("[FATAL] Hello log4j."); //print
        //loger.log( Level.DEBUG , "debug") 와 동일하다.
 }
}

[출처] log4j 설정하기 및 ibatis 쿼리 로그 보기|작성자 깨비


+ Recent posts