'Spring Framework' 카테고리의 다른 글

log4jdbc-remix 설정  (0) 2014.08.01
jstl fn 문자열 함수  (0) 2014.07.28
스마트 에디터  (0) 2014.07.22
페이징  (0) 2014.07.16
[Mybatis] XML 파일에 부등호 포함 쿼리 넣을 때 주의점.  (0) 2014.07.07
Posted by 스트라
,

https://code.google.com/p/log4jdbc-remix/   -> 현재 remix 프로젝트는 종료가 되었다.

https://code.google.com/p/log4jdbc-log4j2/   -> remix 프로젝트에서 사용을 추천하는 것



log4jdbc-remix 설정 방법

http://hnsnmn.blogspot.kr/2014/02/spring-sql.html



SQL Log 직관적으로 볼수 있는 방법이 존재하지 않을까 해서 구글링 해보니 역시나..ㅋㅋog4jdbc-remix 입니다. 설치전에 집고 넘어가야 하는 부분이 있는데, maven repository와 jdk 1.6에서만 지원 가능합니다. 이점 유의하시고 진행해야 될거 같네요. 설치법은 우선 간단합니다.

1. maven인 경우 설치 방법

  1. <dependency>  
  2.   <groupid>org.lazyluke</groupid>  
  3.   <artifactid>log4jdbc-remix</artifactid>  
  4.   <version>0.2.4</version>  
  5. </dependency>  
  6. <dependency>  
  7.   <groupid>org.slf4j</groupid>  
  8.   <artifactid>slf4j-log4j12</artifactid>  
  9.   <version>1.6.1</version>  
  10. </dependency>  

2. classpath로 설정 하는 경우 설치 방법

log4j, slf4j, log4jdbc, log4jdbc-remix를 다운 받아서 클래스 패스 설정을 하시면 됩니다. log4jdbc, slf4j, log4jdbc : http://code.google.com/p/log4jdbc/ log4jdbc-remix : http://code.google.com/p/log4jdbc-remix/ 이렇게 lib파일을 등록 했으면 이제 log4j.xml 설정을 합니다.

  1. <!--?xml version="1.0" encoding="UTF-8" ?-->  
  2.   
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
  4.  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">  
  5.   <layout class="org.apache.log4j.PatternLayout">  
  6.    <param name="ConversionPattern" value="%p - %C{1}.%M(%L) | %m%n">  
  7.   </layout>  
  8.   <filter class="org.apache.log4j.varia.StringMatchFilter">  
  9.    <param name="StringToMatch" value="Result">  
  10.    <param name="AcceptOnMatch" value="false">  
  11.   </filter>  
  12.  </appender>  
  13.   
  14.  <logger name="jdbc.resultsettable" additivity="false">  
  15.   <level value="info">  
  16.   <appender-ref ref="CONSOLE">  
  17.  </appender-ref></level></logger>  
  18.  <logger name="jdbc.audit">  
  19.   <level value="warn">  
  20.   <appender-ref ref="CONSOLE">  
  21.  </appender-ref></level></logger>  
  22.   
  23.   
  24.  <logger name="jdbc.resultset" additivity="false">  
  25.   <level value="warn">  
  26.   <appender-ref ref="CONSOLE">  
  27.  </appender-ref></level></logger>  
  28.   
  29.  <logger name="jdbc.sqltiming" additivity="false">  
  30.   <level value="warn">  
  31.   <appender-ref ref="CONSOLE">  
  32.  </appender-ref></level></logger>  
  33.   
  34.  <root>  
  35.   <priority value="info">  
  36.   <appender-ref ref="CONSOLE">  
  37.  </appender-ref></priority></root>  
  38. </log4j:configuration>  

좀 다른 부분이 logger name이 기존하고는 좀 다른것을 확인하실 수 있을겁니다. 다음으로는 applicationContext.xml에서 dataSource를 변경합니다.

  1. <bean id="dataSource" class="...">  
  2.     <property name="driverClass" value="${datasource.driverClassName}">  
  3.     <property name="jdbcUrl" value="${datasource.url}">  
  4.     <property name="user" value="${datasource.username}">  
  5.     <property name="password" value="${datasource.password}">  
  6.     ...  
  7. </property></property></property></property></bean>  
  8. [/code]  
  9.   
  10. 기존에 이런식으로 설정이 되어있을 것이며 이부분을 밑에 처럼 변경합니다.  
  11.   
  12. [code language="xml"]  
  13. <!-- DataBase -->  
  14. <bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  15.  <property name="driverClassName" value="com.mysql.jdbc.Driver">  
  16.  <property name="url" value="jdbc:mysql://localhost:3306/hnsnmn_db">  
  17.  <property name="username" value="hnsnmn">  
  18.  <property name="password" value="0000">  
  19. </property></property></property></property></bean>  
  20. <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">  
  21.  <constructor-arg ref="dataSourceSpied">  
  22.  <property name="logFormatter">  
  23.   <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">  
  24.    <property name="loggingType" value="MULTI_LINE">  
  25.    <property name="margin" value="19">  
  26.    <property name="sqlPrefix" value="SQL:::">  
  27.   </property></property></property></bean>  
  28.  </property>  
  29. </constructor-arg></bean>  



http://beyondj2ee.tumblr.com/post/14507640070/spring-powerful-sql


(1) Maven인 경우

<dependency>

  <groupId>org.lazyluke</groupId>

  <artifactId>log4jdbc-remix</artifactId>

  <version>0.2.4</version>

</dependency>

<dependency>

  <groupId>org.slf4j</groupId>

  <artifactId>slf4j-log4j12</artifactId>

  <version>1.6.1</version>

</dependency>


(2) classpath로 설정 하는 경우


log4j, slf4j, log4jdbc, log4jdbc-remix를 다운 받아서 클래스 패스 설정을 하시면 됩니다.


log4jdbc, slf4j, log4jdbc : http://code.google.com/p/log4jdbc/

log4jdbc-remix : http://code.google.com/p/log4jdbc-remix/


log4j.xml 설정 하기


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

<!DOCTYPE log4j:configuration PUBLIC “-//LOGGER” “log4j.dtd”>


<log4j:configuration xmlns:log4j=”http://jakarta.apache.org/log4j/”>


    <appender name=”console” class=”org.apache.log4j.ConsoleAppender”>

        <param name=”Target” value=”System.out” />

        <layout class=”org.apache.log4j.PatternLayout”>

            <param name=”ConversionPattern” 

value=”[%d{yyyy-MM-dd HH:mm:ss}] %-5p: %c - %m%n” />

        </layout>

    </appender>


    <logger name=”jdbc.resultsettable” additivity=”false”>

        <level value=”info” />

        <appender-ref ref=”console” />

    </logger>


    <logger name=”jdbc.audit” additivity=”false”>

        <level value=”warn” />

        <appender-ref ref=”console” />

    </logger>


    <logger name=”jdbc.resultset” additivity=”false”>

        <level value=”warn” />

        <appender-ref ref=”console” />

    </logger>

    

    <logger name=”jdbc.sqltiming” additivity=”false”>

        <level value=”warn” />

        <appender-ref ref=”console” />

    </logger>

        

    <!— Root Log Level —>

    <root>

        <priority value=”info” />

        <appender-ref ref=”console” />

    </root>

</log4j:configuration>

Spring Datasource 설정 하기

<!— datasource —>

    <jdbc:embedded-database id=”hsqlDataSource”

        type=”HSQL”>

        <jdbc:script location=”classpath:schema.sql” />

    </jdbc:embedded-database>


    <!— sql spy —>

    <bean id=”dataSource” class=”net.sf.log4jdbc.Log4jdbcProxyDataSource”>

        <constructor-arg ref=”hsqlDataSource” />

        <property name=”logFormatter”>

            <bean class=”net.sf.log4jdbc.tools.Log4JdbcCustomFormatter”>

                <property name=”loggingType” value=”MULTI_LINE” />

                <property name=”margin” value=”19” />

                <property name=”sqlPrefix” value=”SQL:::” />

            </bean>

        </property>

    </bean>



http://goodwilldd.blogspot.kr/2012/06/mybatis-query.html



myBatis query 로그 출력하기

myBatis 의 query를 콘솔에 찍는 많은 방법이 있지만


사용해본 것 중에 가장 간단하고 편한 방법을 소개하고자 한다.


log4jdbc-remix(log4jdbc 를 참고) 라는 것이다.


설정하는 방법은 다음과 같다.




<!-- log4jdbc -->

<dependency>

 <groupId>org.lazyluke</groupId>

 <artifactId>log4jdbc-remix</artifactId>

 <version>0.2.7</version>

</dependency>




위 내용을 pom.xml 에 추가한다.


다음에는 2가지 방법이 있는데, 편한 방법으로 적용하면 된다.


우선 공통 적용 사항은 log4j.xml에



<logger name="jdbc.resultsettable" additivity="false">

 <level value="info" />

 <appender-ref ref="console" />

</logger>


resulttable을 보여주는 부분


<logger name="jdbc.sqlonly" additivity="false">

 <level value="info" />

 <appender-ref ref="console" />

</logger>


쿼리를 출력하는 부분(debug로 설정하면 자세히 나온다)을 추가한다.



해당 부분에 대한 자세한 내용은 log4jdbc set up your logger 를 참고한다.



첫 번째, 방법은 jdbc.properties를 다음과 같이 변경한다.



jdbc.driverClass=net.sf.log4jdbc.DriverSpyjdbc.url=jdbc:log4jdbc:mysql://000.000.000.000:3306/xxxx

jdbc.username=xxxx

jdbc.password=xxxx



두 번째, 방법은



<bean id="logDataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">

 <constructor-arg ref="기존DATASOURCE ID" />

 <property name="logFormatter">

  <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">

   <property name="loggingType" value="MULTI_LINE" />

   <property name="sqlPrefix" value="SQL:::" />

  </bean>

 </property>

</bean>


변경 후, myBatis 설정에서 기존에 datasource id를 logDataSource 로 변경해주는 방법이다

Posted by 스트라
,

fn:contains(string, sbustring) 

string이 substring을 포함하면 return True 


fn:containsIgnoreCase(string, sbustring) 

대소문자 관계없이 string이 substring을 포함하면 return True 


fn:endsWith(string, suffix) 

string이 suffix로 끝나면 return True 


fn:escapeXml(string) 

stting에 XML과 HTML에서 특별한 의미를 가진 문자들이 있으면,

XML엔티티 코드로 바꿔준뒤 문자열 반환 


fn:indexOf(string, sbustring)

 string에서 substring이 처음으로 나타나는 인덱스 반환 


fn:join(array, separator) 

array요소들을 separator를 구분자로 하여 연결해서 반환 


fn:length(item) 

item이 배열이나 컬렉션이면 요소의 객수를 문자열이면 문자의 객수를 반환 


fn:replace(string, before, after) 

string내에 있는 before 문자열을 after 문자열로 모두 변경해서 반환 


fn:split(string, separator) 

string내의 문자열 separetor에 따라 나누어서 배열로 구성해서 반환 


fn:startsWith(string, prefix) 

string이 prefix로 시작하면 return True 


fn:substring(string, begin, end) 

string에서 begin인덱스에서 시작해서 end인덱스에 끝나는 부분의 문자열 반환 


fn:substringAfter(string, sbustring) 

string에서 substring이 나타나는 이후의 문자열 반환 


fn:substringBefore(string, sbustring) 

string에서 substring이 나타나는 이전의 문자열 반환 


fn:toLowerCase(string) 

string을 모두 소문자로 바꿔 리턴 


fn:toUpperCase(string) 

string을 모두 대문자로 바꿔 리턴 


fn:trim(string) 

string앞뒤의 공백을 모두 제거하여 반환


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

2010-12-25

${fn:substring(bean.mem_bir, 0, 4) } = 2010
${fn:substring(bean.mem_bir, 5, 7) } = 12
${fn:substring(bean.mem_bir, 8, 10) } = 25


thdnf1004@nate.com

${fn:substringBefore(bean.mem_mail, '@') } = thdnf1004

${fn:substringAfter(bean.mem_mail, '@') } = nate.com 

Posted by 스트라
,

'Spring Framework' 카테고리의 다른 글

log4jdbc-remix 설정  (0) 2014.08.01
jstl fn 문자열 함수  (0) 2014.07.28
페이징  (0) 2014.07.16
[Mybatis] XML 파일에 부등호 포함 쿼리 넣을 때 주의점.  (0) 2014.07.07
페이징 로직  (0) 2014.07.07
Posted by 스트라
,

페이징

Spring Framework 2014. 7. 16. 18:05

페이징에 필요한 요소

pageNo

현재 페이지


limitList

한 페이지당 보여줄 글의 개수


block

현재 페이지의 블럭

ex. 현재 페이지가 20페이지면 블럭은 두번째 블럭

[11][12][13][14][15][16][17][18][19][20] <- 2번째 블럭


limitPage

한 블럭에 보여줄 페이지의 개수


totalCount

총 레코드의 개수


페이징 하기

현재 상태

pageNo = 1;

block = 1;

totalCount = 100;

limitList = 10;

limitPage = 10;


1. 현재 페이지에서 현재 블럭 구하기

block = ceil(pageNo/limitPage);

* ceil 올림 함수

2. 현재 블럭의 시작 페이지와 끝 페이지

// 시작 페이지 - 1블럭일때 1, 2블럭일때 11

startPage = (block-1)*limitPage + 1;

// 끝 페이지 - 마지막 블럭에서 페이지가 총 페이지 수 보다 커지면 안됨

endPage = startPage + limitPage - 1;

if(endPage > totalPage) endPage = totalPage;

3. 총 페이지 수 구하기

totalPage = ceil(totalCount/limitList);

4. 페이지 출력하기

for (i = startPage; i <= endPage; i++) {

if(pageNo == i) i //진하게 출력하기

else i    // 나머지들은 그냥 출력

}

5. 블럭 이동

[prev] 1 2 3 4 5 6 7 8 9 10 [next]

// 현재의 블럭이 최소 블럭인지 검사

if(block <= 1) "";

else [prev];

// 현재의 블럭이 마지막 블럭인지 검사

totalBlock = ceil(totalPage/limitPage);

if(block >= totalBlock) "";

else [next];

6. DB에서 가져오기

select * from board order by no desc limit start, limitList;

// startRow와 limitList를 설정해 주어야함.

startRow = (page -1) * limitList;


가상 글 번호 뿌려주기

<c:forEach items="${board_list}" var="list" varStatus="status">

<c:out value="${총글개수-((현재페이지번호-1)*페이지당글개수+status.index)}"</c:out>

</c:forEach>


출처 : http://freesearch.pe.kr/archives/21

'Spring Framework' 카테고리의 다른 글

log4jdbc-remix 설정  (0) 2014.08.01
jstl fn 문자열 함수  (0) 2014.07.28
스마트 에디터  (0) 2014.07.22
[Mybatis] XML 파일에 부등호 포함 쿼리 넣을 때 주의점.  (0) 2014.07.07
페이징 로직  (0) 2014.07.07
Posted by 스트라
,

XML 파일에 부등호를 포함한 쿼리를 넣을 때 에러가 발생한다.

The content of elements must consist of well-formed character data or markup.

쿼리를 <![CDATA[]]> 내에 쓰면 해결 된다.

ex) 

<select id="select_board_list" parameterType="map" resultType="kr.co.kkh.model.BoardBean" >

select * from table_name

where

column_name1 < 10    에러 발생

</select>

해결:

<select id="select_board_list" parameterType="map" resultType="kr.co.kkh.model.BoardBean" >

select * from table_name

where

<![CDATA[ column_name1 < 10 ]]>

</select>


혹은


<select id="select_board_list" parameterType="map" resultType="kr.co.kkh.model.BoardBean" >

select * from table_name

where

column_name1 &lt; 10

</select>

&gt; (>),  &lt; (<) 도 사용 가능하다

'Spring Framework' 카테고리의 다른 글

log4jdbc-remix 설정  (0) 2014.08.01
jstl fn 문자열 함수  (0) 2014.07.28
스마트 에디터  (0) 2014.07.22
페이징  (0) 2014.07.16
페이징 로직  (0) 2014.07.07
Posted by 스트라
,

리스트에서 빠질 수 없는게 페이징 시스템입니다…

[1][2][3][4][5][6][7][8][9][10]

위와 같은 페이지를 누름으로써 그에 대한 리스트만 출력하는 것이지요…

이렇게 하는 이유는 전체의 리스트를 화면에 다 보여준다면 빨리 찾을 수도 없고

속도 또한 느립니다. 그래서 페이지로 구분해놓으면 찾아가기 싶게 됩니다..

여기서는 가장 기본적인 개념으로 페이징 시스템을 구현하겠습니다….

방법은 여러가지니깐 여러 각도로 시도해보는 것도 좋을 듯 합니다….

페이징 시스템에서 필요로 하는 것이

1. 현재 페이지

2. 현재 페이지의 블럭

(블럭은 페이지가 속해있는 그룹입니다. 예를 들어서 한 블럭에는 10페이지가 들어가는데 현재의

페이지가 20 페이지 라면 블럭은 두번째 블럭으로 선택이 됩니다.. 그럼 표시는

[11][12][13][14][15][16][17][18][19][20] 으로 되겠죠…

이렇게 하는 이유는 페이지 또한 무한히 많을 수 있기 때문에 페이지 자체의 페이징 시스템을

만드는 거죠. 그것이 블럭입니다. )

3. 전체 행의 개수

(이것을 알아야지만 현재 페이지가 속해 있는 블럭을 계산 할 수 있습니다. )

4. 현재 페이지의 블럭에서 시작페이지와 끝 페이지

(숫자 더하기, 빼기 계산만 하면 되기 때문에 특별한 건 없습니다.)

5. 한 페이지에 보여질 리스트 수 (limitList)

한 블럭에 보여질 페이지 수 (limitPage)

(위의 두가지가 있어야지 전체적인 계산이 됩니다… ^^ )

이상 위의 다섯가지로 일단은 페이지 시스템에 대해서 보여지는 것이 가능하구여

이제 가상으로 페이징 시스템을 만들어 보겠습니다…

1. 현재의 페이지 : 1페이지

2. 현재의 블럭 : 1블럭

3. 전체 행의 개수(total) : 100

4. limitList : 10, limitPage : 5

이렇게 네개의 구성요소로서 시작을 합니다….

리스트가 젤 처음 보여질 때 페이징 시스템은 1블럭의 1페이지를 가리키고 있어야 합니다..

1. 현재 페이지에서 현재 블럭구하는 방법

block=ceil(page/$limitPage);

=> ceil 함수는 만약 숫자가 4.5라고 하면 올림을 하여 5가 되게 하는 함수입니다.

2. 현재 블럭의 시작 페이지와 끝 페이지

// 현재 블럭이 1블럭이라면 1이지만 2 블럭일때는 11이 되어야 합니다

startPage=(block-1)*$limitPage + 1;

// 마지막 블럭에서 페이지가 총페이지 수 보다 커지면 안되기 때문에

// 미리 총 페이지 수를 구해서 큰지 확인해줍니다.

endPage=startPage + $limitPage – 1;

if (endPage>totalPage ) endPage=totalPage;

3. 총 페이지 수 구하는 방법

totalPage=ceil(total/$limitList);

4. 그럼 페이징 시스템을 출력하는건 간단하죠…

for (i=startPage; i<=endPage; $i++)

{

if (page==i) echo “[$i]“;

else echo “[$i]“;

}

현재 페이지는 찐하게 표시해줍니다. 그럼 기본적인 페이지 표시 시스템이 끝이 납니다.

설마 여기서 끝내는건 아니겠죠.. ^^

아까 블럭이란걸 만들었기 때문에 블럭 자체도 이동할 수가 있어야 겠습니다..

보통 게시판에 보면 ◀, ▶ 이런 화살표로 표시 되거나 prev, next 라는 말로 표시되거나 합니다.

[prev] 1 2 3 4 5 6 7 8 9 10 [next]

그래서 블럭을 옮길 수 있게 됩니다..

1. 현재의 블럭이 어딘지 알고 그 앞에 블럭이 있는지 뒤에 블럭이 있는지를 계산해서 표시합니다

현재 블럭은 위에서 구했기 때문에 넘어가구여

// 현재의 블럭이 앞에 있는 아닌지 검사

if ($block <= 1) echo "";

else echo “[prev]“;

// 위의 페이징 시스템 표시

// 마지막 블럭인지 아닌지 검사

totalBlock=ceil(totalPage/$limitPage);

if (block>=totalBlock) echo ” “;

else echo ["next"];

위와 같이 쉽게 구할 수 있습니다. 이건 완전히 산수네요.. ㅋㅋㅋ

이제 페이징 시스템의 마지막 단계가 남았습니다..

디비 관련 작업입니다.. ^^

정렬한 것에 대해서 그 페이지에 맞는 내용을 가져와야 하기 때문에

여기서는 디비 쿼리 명령중 limit라는게 사용됩니다.

예 : select * from test order by groupNum desc, listNum asc limit start,limitList;

젤 마지막에 변수 두개만 설정 해주면 되는데요,,

두가지 옵션은 처음에는 시작되는 row의 번호구여, 뒤에꺼는 몇개를 얻어올껀지 입니다

0, 5 하면 0번째에서 5개행을 얻어온다는 소리하고 같죠.. ^^

마지막 $limitList는 아까 위에 있는 변수랑 같은 거기 때문에 그 대로 주시면 되구여

$start만 계산하면 됩니다..

계산하는 방법은 1페이지 일때 1에서 10, 2 페이지 일때 11에서 20 이런식으로 된다면

디비에서 row는 0부터 시작하기 때문에 0에서 9, 10에서 19 이런식으로 됩니다. 하나 작죠.. ^^

그럼 어떻게 계산을 하느냐…

(page1)limitList;

어디서 많이 본 공식인데..ㅋㅋ 저위에 보면 블럭의 시작페이지 구하는 공식하고 비슷한데

+1 이 빠졌네요 .. 왜 그렇냐면 1씩 작으니깐요.. ^^ 그래서 +1을 해 줄 필요가 없죠….

그래서

select * from test order by groupNum desc, listNum asc limit 0, 10;

하면 0번째 행에서 10개의 행을 얻어오는것이니 바로 리스트에 적용할 수 있겠죠..

리스트 화면에서는 이것에 대한 처리만 해주면 되구여… ^^

약간씩 복잡해 보일 수도 있지만 실상은 더하기 빼기밖에 없네요.. ^^

우리 모두 게시판을 누워서 떡 먹듯 다루는 그 날까지.. 화이팅.. ^^

ps . 예전에 개발해본적이 있는데 jsp로 다시 할라니 조금 헤멧넹…
암튼 이런 자주 사용하는 로직은 정리가 필수다..


출처 : http://freesearch.pe.kr/archives/21

'Spring Framework' 카테고리의 다른 글

log4jdbc-remix 설정  (0) 2014.08.01
jstl fn 문자열 함수  (0) 2014.07.28
스마트 에디터  (0) 2014.07.22
페이징  (0) 2014.07.16
[Mybatis] XML 파일에 부등호 포함 쿼리 넣을 때 주의점.  (0) 2014.07.07
Posted by 스트라
,